0

現在、Objective C で同じファイルにテキストを読み書きしようとしています。

バンドルされたテキストファイルに書き込もうとする前に。それ以来、私はこれが受け入れられないことを学びました。ファイルへの書き込みに関しては、アクセス許可の問題があることを理解しています。

主にObjective C、特にIOの経験が浅いため、最初にいくつかのエラーに直面しています。既存のテキスト ファイルに書き込もうとしている場合、プロジェクト内のどこにファイルを配置すればよいですか? 現在、ファイルをプロジェクトにドラッグアンドドロップしました。私はこれが間違っていると仮定しており、これが私の問題のほとんどがどこから来ているかです.

テキストファイルを書き込むための私のコードは次のとおりです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myFile.txt"];

NSFileHandle *filehandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
[filehandle seekToEndOfFile];
[filehandle writeData:[@"Hello World" dataUsingEncoding:NSUTF8StringEncoding]];

デバッグ時に、 elementfilePathには、私のプロジェクト ディレクトリにもない非常に長いディレクトリが含まれています。

ファイルに書き込むための私のコードは次のとおりです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"myFile.txt"];

NSError *error;
NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

if (error)
    NSLog(@"Error reading file: %@", error.localizedDescription);

myArray = [fileContents componentsSeparatedByString:@"\n"];

ファイルの大部分がファイルが存在する場所から来ていることは理解していますが、どこに置くべきかわかりません。アプリケーションを閉じた後、可能であればファイルの内容を物理的に開いて表示できるようにしたいと考えています。

4

3 に答える 3

1

iOS アプリのファイル システムは多少制限されています。ルールを簡単に説明すると、次のようになります。

  • プロジェクトとそのすべてのリソースがバンドルされています。
  • バンドルは単なるフォルダーです (通常、"YourAppName.app" のような名前が付けられます)。
  • バンドルがデバイスにデプロイされると、アプリケーションには、バンドル内のファイルを変更 (書き込み/削除/名前変更/etc) するための十分な権限がありません。
  • バンドルがインストールされると、サンドボックス化されます。
  • サンドボックスは、バンドルと、アプリの実行に必要なその他のファイルとフォルダーを含む単なるフォルダーです。
  • サンドボックス内のいくつかのフォルダー、つまり「Documents」フォルダーと「Caches」フォルダーへの書き込み権限があります。
  • アプリケーションのサンドボックス外のファイルにはアクセスできません。

一般的なフォルダ構造は次のとおりです。

SandboxFolder
|
|--- Documents <-- this is the folder you are writing to in your code
|
|--- YourAppName.app <-- this is your bundle folder
|
|--- Library
|    |
|    |--- Caches
|    |
|    |--- Preferences
|
|--- tmp

要するに、プロジェクトに追加するファイルはすべてアプリケーションのバンドルになります。アプリケーション内でファイルを読み取ることができます。バンドル内のファイルを見つける最も簡単な方法は、- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extensionそのメソッドに関する情報を見つけることができるユーティリティ メソッドを使用することです。 NSBundleのドキュメントに記載されています。

コード例で行っていることは、(サンドボックス内の) ドキュメント フォルダー内のファイルの読み取りと書き込みに適していますが、アプリケーションが iCloud をサポートしている場合、ドキュメント フォルダー内のファイルは自動的に iCloud にアップロードされることに注意してください。詳細については、iCloud のドキュメントを参照してください。

最後に、フォルダー構造がどのように見えるかをよりよく理解するには (シミュレーターと実際のデバイスの間で非常に似ています)、次の手順に従ってファインダーを使用して確認できます。

    // print the path to the documents folder to the console //
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSLog(@"Documents path: %@", documentsDirectory);
  • コンソールでドキュメント パスを探し (「ドキュメント パス:」を検索)、それをコピーします。
  • ファインダーに移動し、メニューバーから移動 -> フォルダーへ移動... を開きます
  • パスをフィールドに貼り付け、[OK] を押します
  • 新しいウィンドウが開き、ドキュメント フォルダーが表示されます。1 つ上のレベルに進むと、サンドボックスのルートに移動し、アプリ バンドルを表示し、自由に移動してファイルを開き、構造に慣れることができます。

バンドル内のファイルを表示するには、バンドルを右クリックして、コンテキスト メニューから [パッケージの内容を表示] を選択する必要があることに注意してください。

これが役立つことを願っています。

于 2013-04-30T14:04:34.643 に答える
0

他の人が述べたように、プロジェクト内のファイルは最終的にバンドルになるため、それらに書き込むことはできません(Macでは昔ながらの署名されていないアプリを使用できます/できますが、とにかくすべきではありません)。

あなたができることは

  1. ファイルをバンドルに含めます。
  2. 最初の実行では、それを読んでから、コンテンツ全体を Documents フォルダーに書き込みます。
  3. 最初の実行セットアップを完了した場所にフラグを設定して、次回は発生しないようにしてください。必要に応じて、Documents ディレクトリ内のファイルの存在を使用して、そのファイルがコピーされたことを確認できます (自己文書化の一種であり、更新を維持するのが簡単です)。
于 2013-04-30T14:49:28.903 に答える