0

我目前正在尝试将文本写入和读取目标 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”之类的名称)。
  • 将捆绑包部署到设备后,您的应用程序就没有足够的权限来更改(写入/删除/重命名/等)捆绑包中的文件。
  • 安装捆绑包时,它也会被沙盒化。
  • 沙盒只是一个文件夹,其中包含您的包以及您的应用程序需要运行的一些其他文件和文件夹。
  • 您对沙箱中的某些文件夹具有写入权限,即“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 文档以获取更多信息。

最后,为了更好地了解文件夹结构(模拟器和实际设备之间非常相似),您可以使用 finder 来查看,只需按照以下步骤操作:

    // 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);
  • 在控制台中,查找文档路径(搜索“文档路径:”)并复制它
  • 转到查找器并从菜单栏中打开菜单 Go -> Go to folder...
  • 将路径粘贴到字段中,然后按确定
  • 将打开一个带有文档文件夹的新窗口,如果您上一层,您将位于沙箱的根目录,并且能够看到您的应用程序包并自由导航以打开文件并熟悉结构。

请记住,要查看捆绑包中的文件,您必须右键单击它并从上下文菜单中选择“显示包内容”。

我希望这有帮助。

于 2013-04-30T14:04:34.643 回答
0

正如其他人所提到的,您的项目中的文件最终会出现在您的捆绑包中,因此您将永远无法写入它们(您可以/可以在 Mac 上使用老式的未签名应用程序 - 但无论如何您不应该)。

你能做的是

  1. 将文件包含在包中。
  2. 在第一次运行时,阅读它,然后将整个内容写入您的 Documents 文件夹。
  3. 确保在完成第一次运行设置的地方设置了一个标志,这样下次就不会发生这种情况了。如果您愿意,您可以使用 Documents 目录中文件的存在来确定它是否已被复制(一种自我记录且易于保持更新)。
于 2013-04-30T14:49:28.903 回答
0

如果您在模拟器中尝试并想在 mac 中打开它

从日志中复制文件路径 [不包括文件名] 打开 finder>GO>Go to Folder 打开一个窗口粘贴路径并按 Enter

结果:finder 中的窗口打开,显示文件夹和其中的文件

于 2013-04-30T05:47:19.403 回答