txt文件写入在模拟器中工作,但在真实设备xcode中不起作用

时间:2013-09-25 12:54:32

标签: xcode file-io

大家好我们写了一个在模拟器上工作得很好的程序。但是当我们将项目上传到我们自己的设备时,它可以读取文件并显示项目,但是当它尝试擦除文件并再次写入时它不起作用。

可能存在哪些问题以及如何解决此问题?

1 个答案:

答案 0 :(得分:2)

好像您正在尝试在应用包中编写该文件。出于安全考虑,Apple不允许您触摸捆绑包。你必须:

  • 检查您的文件是否存在于沙箱中
  • 如果没有,请从应用包中复制
  • 然后,使用复制的文件

我认为它在模拟器中有效,因为在模拟器中运行应用程序时没有沙箱。 用于在应用程序沙箱中查找正确文件夹的文档如下所示。

Sandbox documentation

File System programming guide

编辑:

以下是一些代码(未在Xcode中运行,可能存在一些拼写错误)将文件从bundle复制到Documents目录中的给定目录中。请注意,此代码每次都会覆盖Documents目录中的文件。

NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *fileDirectory = [documentsDirectory stringByAppendingPathComponent:@"MyDirectory"];

// Create folder if it does not exist
BOOL isDirectory;
if (![[NSFileManager defaultManager] fileExistsAtPath:fileDirectory isDirectory:&isDirectory])
{
    NSError *error;
    [[NSFileManager defaultManager] createDirectoryAtPath:fileDirectory withIntermediateDirectories:NO attributes:nil error:&error];
    if(error)
    {
        NSLog(@"Error creating folder : %@",error.localizedDescription);
        return;
    }
    else
    {
        NSLog(@"Folder created");
    }
}

// Save to disk
NSString *filePathOnDisk = [fileDirectory stringByAppendingPathComponent:@"fileInSandbox.foo"];
NSString *pathFromBundle = [[NSBundle mainBundle] pathForResource:@"fileFromBundle" ofType:@"foo"];
NSData *fileData = [NSData dataWithContentsOfFile:pathFromBundle];
NSError *error;
if (![fileData writeToFile:filePathOnDisk options:NSDataWritingAtomic error:&error])
{
    NSLog(@"Error writing file : %@", error.localizedDescription);
}
else
{
    NSLog(@"File saved to disk successfully");
}

然后,当您要使用复制的文件时,请使用我们在filePathOnDisk中创建的路径。

请再次阅读与文件管理相关的文档,以了解您对文件的处理方式。