2013-04-25 70 views
2

我目前正在写使用下面的代码文件:写入文件 - 目标C

NSString *state = @"Oklahoma"; 

    NSString *filepath = [[NSBundle mainBundle] pathForResource:@"StatesVisited" ofType:@"txt"]; 
    NSFileHandle *filehandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; 
    [filehandle seekToEndOfFile]; 
    [filehandle writeData:[state dataUsingEncoding:NSUTF8StringEncoding]]; 
    [filehandle closeFile]; 

从我可以告诉,这应该工作。我已经能够使用相同的文件路径从文件中读取数据。

当我运行这段代码,并打开我的文本文件什么都不存在。

+2

请记住,在阅读权限并不意味着你也有写权限。 – 2013-04-25 21:25:37

+0

如何获得写入和读取到同一文件的权限? – Johnrad 2013-04-25 21:27:31

+0

@JohnnyWhisman你**不能**在运行时获得对主包的写入权限。一旦应用程序被编译和部署,该包就会被签名。这是为了确保你的恶意软件已经改变了应用程序。 ** SandBox ** – 2013-04-25 22:20:07

回答

3

[NSBundle mainBundle]必须被视为只读。相反,请将该文件夹中的文件复制到应用程序支持目录,然后在其中写入。

使用this查找/创建应用程序支持目录。

+0

我也经常从文件中读取文件。我是否需要从支持目录中的文件中读取数据? – Johnrad 2013-04-25 21:38:41

+2

这并不是说主包必须被视为只读,而是主包是只读的(至少在真实设备上)。 – rmaddy 2013-04-25 23:04:15

+0

@rmaddy这取决于操作系统。在Mac OS X上,它通常是可写的,在Xcode的iOS模拟器中它可能是可写的,在越狱的iPhone上它可能是可写的(我不知道这一点,你必须测试)。即使你可以写信给它,这也不是个好主意,因为升级到新版本的应用程序将覆盖该文件。 – 2013-04-26 00:17:26

1

禁止写入主包中的资源。在这种情况下,您必须使用沙盒路径的/Documents/Library

第一次启动您的应用程序只是复制所有捆绑的文件/文件到/ Documents,here's a link以下。

之后,只需按照自己的设计 - 这一次它会工作得很好。

+0

我已将此代码添加到我的viewDidLoad方法中。这是否会改变我为阅读和写作而编写的任何代码。或者,我需要添加这一切吗? – Johnrad 2013-04-25 21:44:24

+0

而不是从NSBundle制作文件路径,您需要从/ Documents文件夹中找到路径: – 2013-04-26 11:20:27

0

您可能从fileHandleForWritingAtPath:获得无文件句柄,因为您尝试在应用程序包中打开文件。如果数据合适,您可以将数据写入NSUserDefaults。否则,您应该将文件写入您的应用程序支持目录。以下blog post描述了如何获取它或遵循@Sebastians关于Document文件夹的建议。

0

试试这个

NSString *state = @"Oklahoma"; 
NSString *strPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
       strPath = [strPath stringByAppendingPathComponent:@"StatesVisited.txt"]; 
       [state writeToFile:strPath 
          atomically:NO 
          encoding:NSStringEncodingConversionAllowLossy 
           error:nil];