在iOS 7中将文本文件保存到文档目录

25
我将尝试将一个纯文本文件保存到iOS 7中的“文档”目录中。以下是我的代码:
//Saving file
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

NSString *url = [NSString stringWithFormat:@"%@", urls[0]];

NSString *someText = @"Random Text To Be Saved";
NSString *destination = [url stringByAppendingPathComponent:@"File.txt"];

NSError *error = nil;

BOOL succeeded = [someText writeToFile:destination atomically:YES encoding:NSUTF8StringEncoding error:&error];

if (succeeded) {
    NSLog(@"Success at: %@",destination);
} else {
    NSLog(@"Failed to store. Error: %@",error);
}

我遇到的错误如下:

2013-10-13 16:09:13.848 SavingFileTest[13675:a0b] Failed to store. Error: Error Domain=NSCocoaErrorDomain Code=4 "The operation couldn’t be completed. (Cocoa error 4.)" UserInfo=0x1090895f0 {NSFilePath=file:/Users/Username/Library/Application%20Support/iPhone%20Simulator/7.0-64/Applications/F5DA3E33-80F7-439B-A9AF-E8C7FC4E1630/Documents/File.txt, NSUserStringVariant=Folder, NSUnderlyingError=0x10902aeb0 "The operation couldn’t be completed. No such file or directory"}

我弄不清楚为什么在模拟器上运行时会出现这个错误。如果我使用NSTemporaryDirectory(),就能正常工作。


你验证过那个目录是否存在了吗?它看起来是有效的代码。 - madmik3
我在终端上打了这个命令:cd Library/Application Support,但是无法正确输入 Application Support 中的空格。 - user2877212
在路径周围添加引号。 - madmik3
3个回答

61

从苹果公司的Xcode模板中:

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory 
         inDomains:NSUserDomainMask] lastObject];
}

你可以像这样保存:

NSString *path = [[self applicationDocumentsDirectory].path 
                       stringByAppendingPathComponent:@"fileName.txt"];
[sampleText writeToFile:path atomically:YES
                       encoding:NSUTF8StringEncoding error:nil];

1
@Mundi 我很好奇为什么应用程序目录应该是 NSURL 对象数组的 lastObject - George
3
方便起见,预期结果是一个只有一个元素的数组,所以你可以使用 [0](如果数组为空,则可能会崩溃),或者使用 firstObjectlastObject(它们不会崩溃,而是返回 nil)。 - Mundi
在Swift中:NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).first as String - Berik
在文件名前面加上斜杠“/”: NSString *path = [[self applicationDocumentsDirectory].path stringByAppendingPathComponent:@"/fileName.txt"]; 否则它将无法保存到文档目录中。 - Syed Asad Ali

4

以下是 Mundi 在 Swift 中的回答:

    let fileName = "/File Name.txt"
    let filePath = self.applicationDocumentsDirectory().path?.stringByAppendingString(fileName)

    do {
        try strFileContents.writeToFile(filePath!, atomically: true, encoding: NSUTF8StringEncoding)
        print(filePath)
    }
    catch {
        // error saving file
    }

func applicationDocumentsDirectory() -> NSURL {

    return NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last!
}

Swift 5:let filePath = self.applicationDocumentsDirectory().path?.appending(fileName) - quin

1
    -(void)writeATEndOfFile:(NSString *)content2
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];

        //make a file name to write the data to using the documents directory:
        NSString *fileName = [NSString stringWithFormat:@"%@/textfile.txt",
                              documentsDirectory];

        if([[NSFileManager defaultManager] fileExistsAtPath:fileName])
        {
            NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:fileName];
            [fileHandle seekToEndOfFile];
            NSString *writedStr = [[NSString alloc]initWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:nil];
            content2 = [content2 stringByAppendingString:@"\n"];
            writedStr = [writedStr stringByAppendingString:content2];

            [writedStr writeToFile:fileName
                        atomically:NO
                          encoding:NSStringEncodingConversionAllowLossy
                             error:nil];
        }
        else {
            int n = [content2 intValue];
            [self writeToTextFile:n];
        }

    }   


 -(void) writeToTextFile:(int) value{
        //get the documents directory:
        NSArray *paths = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];

        //make a file name to write the data to using the documents directory:
        NSString *fileName = [NSString stringWithFormat:@"%@/textfile.txt",
                              documentsDirectory];
        //create content - four lines of text
       // NSString *content = @"One\nTwo\nThree\nFour\nFive";

        NSString *content2 = [NSString stringWithFormat:@"%d",value];
        content = [content2 stringByAppendingString:@"\n"];
        //save content to the documents directory
        [content writeToFile:fileName
                  atomically:NO
                    encoding:NSStringEncodingConversionAllowLossy
                       error:nil];

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接