将对象正确移动到废纸篓

Posted

技术标签:

【中文标题】将对象正确移动到废纸篓【英文标题】:Properly move an object to the Trash 【发布时间】:2015-12-02 03:54:39 【问题描述】:

在 Cocoa 上似乎有很多方法可以将文件/文件夹目录移动到垃圾箱:

    [[[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation] [[NSWorkspace sharedWorkspace] recycleURLs:] [NSFileManager 垃圾项AtURL:] [NSFileManager removeItemAtPath:] [NSFileManager removeItemAtURL:]

通过阅读此处的说明或指向 Apple 官方文档的链接来了解区别是什么。

另外,如果有人知道将文件/非空目录移动到废纸篓的通用方法,我很高兴知道。

【问题讨论】:

【参考方案1】:
    [[[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation]

从 OS X 10.11 开始,它已被弃用,因此没有必要使用它。

    [[NSWorkspace sharedWorkspace] recycleURLs:]

这可能是您想要的。它是异步的,因此您的应用程序可以在将文件移至回收站时继续运行。

    [NSFileManager 垃圾项AtURL:]

这类似于选项 2,但它是同步的,一次只处理一个文件。

    [NSFileManager removeItemAtPath:]

这不会删除文件,它会立即永久删除它。

    [NSFileManager removeItemAtURL:]

这与选项 4 类似,不同之处在于使用 file:// URL 而不是路径。当您已经有了 URL 而不是路径时会更方便。

NSWorkspace 和 NSFileManager 的参考页面很好地涵盖了这些方法之间的所有差异。


这是一个快速示例,它使用 recycleUrls: 删除用户桌面上名为“Junk”的文件或文件夹:

- (IBAction)deleteJunk:(id)sender 
    NSFileManager *manager = [NSFileManager defaultManager];
    NSURL *url = [manager URLForDirectory:NSDesktopDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; // get Desktop folder
    url = [url URLByAppendingPathComponent:@"Junk"]; // URL to a file or folder named "Junk" on the Desktop
    NSArray *files = [NSArray arrayWithObject: url];
    [[NSWorkspace sharedWorkspace] recycleURLs:files completionHandler:^(NSDictionary *newURLs, NSError *error) 
        if (error != nil) 
            //do something about the error
            NSLog(@"%@", error);
        
        for (NSString *file in newURLs) 
            NSLog(@"File %@ moved to %@", file, [newURLs objectForKey:file]);
        
    ];

【讨论】:

1.我需要可以在 10.6+ 中运行的代码。 2. 解决方案 2 是否适用于文件和非空目录?我也会检查这些参考资料。你能放一些示例代码来垃圾目录吗? recycleUrls: 在 OS X 10.6 及更高版本中可用。我在答案中添加了一些示例代码。 我在“NSArray *files = @[url];”这一行遇到错误。谷歌搜索说我需要最新的 LLVM,但我没有。我在 10.6 上使用 XCode 4.2。我如何重写这一行?谢谢。 我把它改成了老式的 Objective-C 符号。希望对您有所帮助。 选项 2 和 3 都接受通配符吗?选项 3 可以发送目录而不仅仅是文件,对吗?选项 3 也是 10.6+,对吧?谢谢。

以上是关于将对象正确移动到废纸篓的主要内容,如果未能解决你的问题,请参考以下文章

Macbook pro废纸篓总显示我的移动硬盘有个文件正在使用无法删除。

如何从Mac上卸载Safari

Mac卸载软件 CleanMyMac最好选择

将 CoreData 数据块移动到单独的对象中

qt 通过将对象移动到跨线程发出信号

Mac应用程序无法打开,提示不明开发者或文件损坏的处理方法