2

使用 NSFileManager 的“copyItemAtPath”方法,如果存在相同的文件或文件夹,会发生错误。

NSFileManager 中是否有替换功能?

(如果存在相同的文件,删除并复制如果没有,只需复制。)

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self generateTableContents];

}


- (void)generateTableContents {

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *appsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [appsDirectory objectAtIndex:0];

    [fileManager changeCurrentDirectoryPath:documentPath];
    [fileManager createDirectoryAtPath:@"user_List1" withIntermediateDirectories:YES attributes:nil error:nil];

    NSString *bundlePath = [[NSBundle mainBundle] resourcePath];

    NSError *error; // to hold the error details if things go wrong
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"IMG_0523" ofType:@"JPG"];

    if ([fileManager copyItemAtPath:sourcePath toPath: @"./user_List1/newIMG_0523.JPG" error:&error]) {
        NSLog(@"Copy complete!");
    } else {
        NSLog(@"Copy Failed : %@", error);
    }


    if ([fileManager copyItemAtPath:@"./user_List1" toPath: @"./user_List2" error:&error]) {
        NSLog(@"Copy complete!");
    } else {
        NSLog(@"Copy Failed : %@", error);
    }



}

执行结果完成。

在此处输入图像描述

/Users/nice7285/Library/Caches/appCode10/DerivedData/tempPrg-dd15264d/Build/Products/Debug-iphonesimulator/tempPrg.app/tempPrg
Simulator session started with process 1184
2012-10-04 06:28:32.653 tempPrg[1184:11303] Copy complete!
2012-10-04 06:28:32.672 tempPrg[1184:11303] Copy complete!

Process finished with exit code 143

但是当已经存在文件夹时。

在此处输入图像描述

结果是失败。

2012-10-04 06:48:31.488 tempPrg[1243:11303] Copy Failed
2012-10-04 06:48:31.497 tempPrg[1243:11303] Copy Failed
4

2 回答 2

7

您需要进行原子保存,例如:

NSData *myData = ...; //fetched from somewhere
[myData writeToFile:targetPath atomically:YES];

但是由于您使用的是 copyItemAtPath,所以我不知道是否可以原子地使用它,所以我只想进行快速肮脏的黑客攻击:

if ([fileManager fileExistsAtPath:txtPath] == YES) {
    [fileManager removeItemAtPath:txtPath error:&error]
}

NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"txtFile" ofType:@"txt"];
[fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error];

来源:IOS:在文档文件夹中复制文件

于 2012-10-03T22:06:45.303 回答
1

从 iOS 4(和 macOS 10.7)开始,有一种明确的方法可以将一个项目替换为另一个项目。它甚至保留原始文件的属性(可选)

- (BOOL)replaceItemAtURL:(NSURL *)originalItemURL withItemAtURL:(NSURL *)newItemURL backupItemName:(NSString *)backupItemName options:(NSFileManagerItemReplacementOptions)options resultingItemURL:(NSURL * _Nullable *)resultingURL error:(NSError * _Nullable *)error;

以确保不会发生数据丢失的方式替换指定 URL 处的项目内容。

replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:

于 2019-09-05T19:26:43.990 回答