【问题标题】:Write to File - Objective C [duplicate]写入文件 - 目标 C [重复]
【发布时间】:2013-04-19 22:46:11
【问题描述】:

我目前正在尝试使用以下代码写入文件:

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

据我所知,这应该可行。我已经能够使用相同的文件路径从文件中读取。

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

【问题讨论】:

  • 请记住,拥有读取权限并不意味着您也拥有写入权限。
  • 如何获得对同一个文件的读写权限?
  • @JohnnyWhisman 您无法在运行时获得对主包的写入权限。编译和部署应用程序后,会对捆绑包进行签名。这是为了确保您的恶意软件已更改应用程序。 沙盒

标签: ios file-io


【解决方案1】:

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

在您的应用首次启动时,只需将所有捆绑的文档/文件复制到 /Documents,here's a link 即可。

之后,只需按照您自己的设计进行操作 - 这次会正常工作。

【讨论】:

  • 我已将此代码添加到我的 viewDidLoad 方法中以供查看。这会改变我为读写而编写的任何代码吗?或者这就是我需要添加的全部内容?
  • 你需要从 /Documents 文件夹中找到路径,而不是从 NSBundle 创建文件路径:
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我也经常从文件中读取。我还需要读取支持目录中的文件吗?
    • 不是说主包必须被视为只读,而是主包是只读的(至少在真实设备上)。
    • @rmaddy 这取决于操作系统。在 Mac OS X 上它通常是可写的,在 Xcode 的 iOS 模拟器中它可能是可写的,而在越狱的 iPhone 上它可能是可写的(我不知道,你必须测试)。即使您可以写入它也是一个坏主意,因为升级到新版本的应用程序会覆盖该文件。
    • @JohnnyWhisman 是的,您需要阅读应用支持而不是主包。
    【解决方案4】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2016-08-21
      • 2013-06-14
      • 2014-03-21
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多