2

把我的头发拉出来试图解决这个问题。我想在我的项目中读取一个数字列表并将其写入一个 txt 文件。但是 [string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error] 似乎没有向文件写入任何内容。我可以看到路径字符串返回一个文件路径,所以它似乎找到了它,但似乎没有向文件写入任何内容。

+(void)WriteProductIdToWishList:(NSNumber*)productId {

    for (NSString* s in [self GetProductsFromWishList]) {
        if([s isEqualToString:[productId stringValue]]) {
            //exists already
            return;
        }
    }

    NSString *string = [NSString stringWithFormat:@"%@:",productId];   // your string
    NSString *path = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];
    NSError *error = nil;
    [string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
    NSLog(@"%@", error.localizedFailureReason);


    // path to your .txt file
    // Open output file in append mode: 
}

编辑:路径显示为 /var/mobile/Applications/CFC1ECEC-2A3D-457D-8BDF-639B79B13429/newAR.app/WishList.txt 所以确实存在。但是读回来:

NSString *path = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];

只返回一个空字符串。

4

2 回答 2

10

您正在尝试写入应用程序包内的位置,由于包是只读的,因此无法修改该位置。您需要找到一个可写的位置(在应用程序的沙箱中),然后在调用string:WriteToFile:.

通常,应用程序会在第一次运行时从包中读取资源,将所述文件复制到合适的位置(尝试文档文件夹或临时文件夹),然后继续修改文件。

因此,例如,类似以下内容:

// Path for original file in bundle..
NSString *originalPath = [[NSBundle mainBundle] pathForResource:@"WishList" ofType:@"txt"];
NSURL *originalURL = [NSURL URLWithString:originalPath];

// Destination for file that is writeable
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSURL *documentsURL = [NSURL URLWithString:documentsDirectory];

NSString *fileNameComponent = [[originalPath pathComponents] lastObject];
NSURL *destinationURL = [documentsURL URLByAppendingPathComponent:fileNameComponent];

// Copy file to new location
NSError *anError;
[[NSFileManager defaultManager] copyItemAtURL:originalURL
                                        toURL:destinationURL
                                        error:&anError];

// Now you can write to the file....
NSString *string = [NSString stringWithFormat:@"%@:", yourString]; 
NSError *writeError = nil;
[string writeToFile:destinationURL atomically:YES encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@", writeError.localizedFailureReason);

继续前进(假设您希望随着时间的推移继续修改文件),您需要评估该文件是否已存在于用户的文档文件夹中,确保仅在需要时从捆绑包中复制该文件(否则您将每次都用原始捆绑副本覆盖您修改过的文件)。

于 2013-05-10T16:58:17.987 回答
2

要摆脱写入特定目录中文件的所有麻烦,请使用NSUserDefaults该类来存储/检索键值对。这样你64岁时还有头发。

于 2013-05-10T17:47:24.647 回答