读写同一文件

时间:2013-04-30 01:14:39

标签: ios cocoa-touch file-io

我目前正在尝试在目标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]];

调试时,元素filePath包含一个非常长的目录,该目录甚至不在我的项目目录中。

以下是我写入文件的代码:

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"];

据我所知,大部分文件来自文件所在的位置,我根本不知道放在哪里。在应用程序关闭后,我还希望能够在物理上打开并查看文件的内容。

3 个答案:

答案 0 :(得分:1)

iOS应用程序的文件系统受到一定限制,对规则的简单解释如下:

  • 您的项目及其所有资源都已捆绑在一起。
  • 捆绑包只是一个文件夹(通常命名为" YourAppName.app")。
  • 将捆绑包部署到设备后,您的应用程序没有足够的权限来更改(写入/删除/重命名/等)捆绑包中的文件。
  • 安装捆绑包时,它也会被沙箱化。
  • 沙箱只是一个文件夹,其中包含您的应用程序需要运行的捆绑包以及其他一些文件和文件夹。
  • 您对沙盒中的某些文件夹具有写入权限,即" Documents"文件夹和"缓存"文件夹中。
  • 您无法访问应用程序沙箱之外的任何文件。

典型的文件夹结构是:

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 documentation中找到有关该方法的信息。

您在代码示例中所做的工作有利于读取和写入文档文件夹(在沙箱中)中的文件,这很好但请记住,如果您的应用程序支持文档文件夹中的iCloud文件,自动上传到iCloud。有关详细信息,请查看iCloud documentation

最后为了更好地了解文件夹结构的外观(模拟器和实际设备之间非常相似),您可以使用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);
  • 在控制台中,查找文档路径(搜索&#34;文档路径:&#34;)并复制
  • 转到查找程序并打开菜单Go - &gt;从菜单栏
  • 转到文件夹....
  • 将路径粘贴到字段中,然后按确定
  • 将打开一个带有文档文件夹的新窗口,如果您上升到一个级别,您将位于沙箱的根目录,并且能够看到您的应用程序包并自由导航以打开文件并熟悉结构。

请注意,要查看捆绑包中的文件,您必须右键单击它并选择&#34;显示包裹内容&#34;从上下文菜单中。

我希望这会有所帮助。

答案 1 :(得分:0)

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

从日志中复制文件路径[不包括文件名] 打开查找器&gt; GO&gt;转到文件夹 将打开一个窗口粘贴路径并按Enter键

结果: 查找器中的窗口打开,显示

中的文件夹和文件

答案 2 :(得分:0)

正如其他人所提到的,项目中的文件最终会出现在你的软件包中,所以你永远无法写信给他们(你可以/可以在Mac上使用老式的非签名应用程序 - 但你不应该' t,无论如何)。

你能做的是

  1. 将文件包含在捆绑包中。
  2. 在第一次运行时,阅读它,然后将整个内容写入您的Documents文件夹。
  3. 确保在已完成首次运行设置的位置设置标记,因此下次不会发生。如果您愿意,可以使用Documents目录中存在的文件来确定它已被复制(自我记录的类型并且易于更新)。