2013-04-30 44 views
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]]; 

在调试,元素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"]; 

据我所知,大多数的文件从文件所在的到来,我只是不知道放在哪里。我也希望在应用程序关闭后能够在物理上打开并查看文件的内容。

+0

未来,请不要删除[您的问题](http://stackoverflow.com/questions/16290447/read-and-write-to-same-file-objective-c)并重新发布。改编它。 – 2013-04-30 01:18:07

+0

你只是问在你的硬盘上文件的位置,或者是否有写入时发生的错误或意外结果?或者是什么?目前还不清楚你有什么困难。 – 2013-04-30 01:21:18

+0

我对此表示歉意,我并不熟悉在那种情况下应该怎么做。 – Johnrad 2013-04-30 01:53:28

回答

1

文件系统中的文件iOS应用有所限制,规则简单的解释s将如下:

  • 您的项目及其所有资源已捆绑。
  • 一个包只是一个文件夹(通常命名为“YourAppName.app”)。
  • 一旦将软件包部署到设备上,您的应用程序就没有足够的权限来更改软件包中的文件(写入/删除/重命名/ etc)。
  • 安装软件包时,它也是沙箱。
  • 沙箱只是一个文件夹,其中包含您的应用程序需要运行的包和其他一些文件和文件夹。
  • 您有权对沙箱中的某些文件夹(即“文档”文件夹和“缓存”文件夹)写入权限。
  • 您无法访问应用程序沙箱外的任何文件。

典型的文件夹结构是:

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了解更多信息。

最后得到的文件夹结构是什么样子(这是模拟器和实际设备之间非常相似),您可以使用取景器来看看一个更好的主意,只要按照下列步骤操作:

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

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

我希望这会有所帮助。

+0

另外,为了读取设备上的文件结构(和修改文件),请尝试[iExplorer](http://www.macroplant.com/iexplorer/) – Dario 2013-04-30 15:02:59

+0

非常感谢您的支持。我自己无法弄清楚这一点令人感到尴尬,我想这是因为我对iOS开发经验不足。但我必须在某个地方学习。我从来没有想到,我不得不查看模拟器文件系统来查找我的文件,而不是我的项目。再次感谢你的帮助! – Johnrad 2013-04-30 17:58:21

0

如果您在模拟器尝试,并希望在MAC

从日志复制文件路径来打开它[不包括文件名] 打开Finder> GO>前往文件夹 打开一个窗口粘贴路径,然后按回车

结果: 取景器中打开一个窗口,显示该文件夹,里面

0

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

你可以做的是

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