web-dev-qa-db-ja.com

モノタッチでファイルに書き込む

Monotouch iPhoneアプリでファイルを作成して書き込むにはどうすればよいですか?

ファイルはアプリケーションの起動間も保持されるはずなので、アプリバンドルのどこかに配置する必要があると思います(ドキュメントまたはリソース?)。

35
Bryan

[注:アプリのバンドルやiPhoneアプリのサンドボックス化された小さな世界の構造に関する理解のレベルがわからないため、私の回答はかなり徹底的です-すでに知っていることをカバーしている場合はお詫びします-私は好きですhow...]を議論するときに、少なすぎるより多すぎる、そしてwhyを少し追加する

(もちろん)いくつかのオプションがあります。あなたはすでに.Netにある程度精通しており、あなたの質問はこれをiPhoneWayで行う方法に関するものだと思います。

すべてのiPhoneアプリ(OS Xのアプリでも同じことがわかります)は「バンドル」であり、従来の意味では実行可能ではありませんが、実際には、アプリのバイナリが(リソースとともに)存在するフォルダー階層です。 、設定など)。

非常にサンドボックス化されたiPhoneアプリであるため、デスクトップ開発を行うときに通常使用できる共有フォルダーにアクセスできません(たとえば、ユーザーのホームフォルダーの下にある共通のDocumentsフォルダーがあります。どのアプリケーションがアクセスできるか)。

代わりに、アプリには独自のフォルダー階層があります。これは、通常、アプリ間で共有される独自のフォルダーセットのようなものです。

電話でアプリのフォルダー構造がどのように見えるかを確認する最も簡単な方法は、iPhoneシミュレーターがアプリのインストール、設定、何とか何とか何とかして使用するフォルダーを確認することです。私のマシンでは(これが構成可能かどうかは思い出せませんが、おそらくシステムでも同じです)、次のパスでフォルダーにアクセスできます。

_~/Library/Application Support/iPhone Simulator_

その中に、シミュレーターにインストールしたアプリを含むUser/Applicationsフォルダーがあります。これらのフォルダーのいずれかにドリルダウンすると、アプリが電話でアクセスできるフォルダー構造を確認できます。

アプリセッション間で保持したいファイルを保存するには、アプリのDocumentsフォルダーが最適です。ファイルを作成するための唯一の選択肢ではありませんが、このジョブのrightの選択肢です。ファイルが適切に保存されることに加えて、ファイルをDocumentsフォルダーに保持すると、ユーザーが同期したときにiTunesによってファイルがバックアップされます。

MonoTouchを使用すると、Environment.GetFolderPath(Environment.SpecialFolder.Personal);を使用してアプリのドキュメントフォルダーパスを取得できます。

テストしたい場合、これは「out.txt」というファイルをアプリのDocumentsフォルダーに書き込む非常に単純なコードです。このコードは、ファイルの内容を読み取って、ファイルが作成されたことを示します。さらに確認するには、シミュレーターのアプリケーションフォルダーに移動し、アプリフォルダーを変更日で並べ替え、最後に変更されたものにドリルダウンして、ドキュメント内を確認します。フォルダー-「out.txt」が見つかります(アプリをインストールすると、「2B3CA854-FADB-4DDC-9732-0E61B3DD8D8C」のような名前のフォルダー内にアプリが詰め込まれるため、名前でアプリのフォルダーを見つけることはできません。 "-フォルダーを変更された日付で並べ替えると、最後に変更されたアプリが表示されます。この場合は、次のコードが含まれているアプリです)。

_// For this to function, don't forget "using System.IO;"

// If you're just playing around with this to see it work, place it inside
// your AppDelegate's "FinishedLaunching" method in main.cs

string path = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
string filePath = Path.Combine(path, "out.txt");

// File.WriteAllText will create a file and then write text to it. If the
// file already exists, File.WriteAllText will overwrite it.
File.WriteAllText(filePath, "Howdy, world.");

// Now we prove it worked by reading the contents of the file and then
// printing them to the console...   
string text = File.ReadAllText(filePath);
Console.WriteLine(text);
_

したがって、ここで本当にiPhone固有であるのは、「Environment.SpecialFolder.Personal」がアプリのDocumentsフォルダーにマップされることを知っていることだけです。それを超えて、それはいつものように.Netです。

そして、繰り返しますが、これはおそらくやり過ぎでしたが、私はそれを見るすべての人に十分に徹底的に答えたかったです-これが役立つことを願っています:)

106
Rory Blyth

Xamarin.iOSガイドサイトの次のハウツーには、ファイルを保存する場所へのポインタがいくつかあります。

http://docs.xamarin.com/guides/ios/application_fundamentals/working_with_the_file_system/

13
miguel.de.icaza

実行時に次のようなことを行うことができます。

_using (StreamWriter writer = new StreamWriter (Path.Combine (Environment.SpecialFolders.Documents, "yourfilename.ext"))) { }
_

これでファイルが作成されます。読み取り用に開くには、同じPath.Combine()を使用しますが、StreamReaderを使用します。

8
Gonzalo