Objective-c:将目录复制到另一个

Posted

技术标签:

【中文标题】Objective-c:将目录复制到另一个【英文标题】:Objective-c: Copying a Directory to another 【发布时间】:2014-04-28 12:07:01 【问题描述】:

我正在尝试将整个文件夹内容复制到我创建的另一个文件夹,在 ios 上使用 Objective-c。

我已经尝试使用 NSFileManager 来创建和复制带有 UIAlertView 的目录来检查错误:

[[NSFileManager defaultManager] createDirectoryAtPath:@"/tmp/Destination/Directory/" withIntermediateDirectories:YES attributes:nil error:NULL];

NSError *copyError = nil;
if (![[NSFileManager defaultManager] copyItemAtPath:@"/Source/Directory/ toPath:@"/tmp/Destination/Directory/" error:&copyError]) 

    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Watusi" message:[copyError description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alertView show];

代码不起作用,我收到以下错误:

Error Domain=NSCocoaErrorDomainCode=516 "The operation coulnd't be completed. 
(Cocoas error 516.)" Userinfo=0x1666db90 NSSourceFilePathErrorKey=/Source/Directory/, NSUserStringVariant=(Copy),
NSFilePath=/Source/Directory/,NSDestionationFilePath=/tmp/Destination/Directory/, 
NSUnderlyingError=0x14697b30 "The Operation couldn't be completed. File Exists"

实际上目录正在创建,但文件没有被复制到它

我已检查与我的问题相关的所有问题,但无法解决。

【问题讨论】:

【参考方案1】:

错误原因在"The Operation couldn't be completed. File Exists"中非常明显

toPath:@"/tmp/Destination/Directory/" 处的文件夹Directory 将自动创建,

我是在 createDirectoryAtPath:@"/tmp/Destination/Directory/" 中手动创建的,这是错误的

所以固定的代码是:

[[NSFileManager defaultManager] createDirectoryAtPath:@"/tmp/Destination/" withIntermediateDirectories:YES attributes:nil error:NULL];

NSError *copyError = nil;
if (![[NSFileManager defaultManager] copyItemAtPath:@"/Source/Directory/" toPath:@"/tmp/Destination/Directory/" error:&copyError]) 

    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"title" message:[copyError description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alertView show];

注意:代码用于复制目录及其子目录

【讨论】:

【参考方案2】:

您需要创建目标目录,然后枚举源目录中的所有文件并将它们复制到目标

子目录会使事情变得有点复杂。如果你有它们,你的枚举代码应该是递归的

更新日期:

这是代码示例。请注意,它不处理子目录。

NSString *sourcePath = @"...";
NSString *destPath = @"...";
NSFileManager *fm = [NSFileManager defaultManager];

[fm createDirectoryAtPath:destPath withIntermediateDirectories:YES attributes:nil error:NULL];

NSArray *sourceFiles = [fm contentsOfDirectoryAtPath:sourcePath error:NULL];
NSError *copyError = nil;

BOOL isDirectory;

for (NSString *currentFile in sourceFiles)

    if ([fm fileExistsAtPath:currentFile isDirectory:&isDirectory] && !isDirectory)
    
        if (![fm copyItemAtPath:[sourcePath stringByAppendingPathComponent:currentFile] toPath:[destPath stringByAppendingPathComponent:currentFile] error:&copyError])
        
            UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Watusi" message:[copyError description] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
            [alertView show];
        
    

此外,我不会在每次不成功的复制操作后显示错误,而是创建一个可变数组,在其中添加复制失败的文件名,然后将它们显示给用户循环。

【讨论】:

正如我所提到的,我正在使用createDirectoryAtPath: 创建目标目录,请问我可以举一个关于如何枚举和复制文件的小例子吗? 嘿!感谢您的帮助,但此代码甚至无法复制 1 个文件夹内容:/ 实际上我还需要复制其子目录。 如何在 Xcode 项目中创建源目录? ([fm fileExistsAtPath:currentFile isDirectory:&isDirectory] ​​&& !isDirectory) 将返回 false!

以上是关于Objective-c:将目录复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

将一个目录及其所有内容批量复制到另一个目录

使用 Grunt.js 将所有文件从目录复制到另一个目录

使用 Grunt.js 将所有文件从目录复制到另一个目录

如何在Objective c中获取目录中文件的创建日期

CentOS:将目录复制到另一个目录

linux 怎样复制一个目录的所有文件到另一个目录