通过Objective-C / Cocoa清空垃圾桶

时间:2011-03-17 03:04:37

标签: objective-c cocoa macos nsfilemanager recycle-bin

我想知道是否有办法以编程方式清空垃圾箱的内容。我目前正在删除位于那里的文件:

    NSFileManager *manager = [NSFileManager defaultManager];
    [manager removeItemAtPath:fileToDelete error:nil];

但是,在我使用此操作后,每次将文件拖到回收站时,系统都会提示我:

  

您确定要删除吗?   “xxxxxx.xxx”?此项目将被删除   立即。你无法撤消这个   动作。

这一直持续到我退出或sudo rm -rf垃圾桶。

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以尝试使用AppleScript来执行此操作:

NSString* appleScriptString = @"tell application \"Finder\"\n"
                              @"if length of (items in the trash as string) is 0 then return\n"
                              @"empty trash\n"
                              @"repeat until (count items of trash) = 0\n"
                              @"delay 1\n"
                              @"end repeat\n"
                              @"end tell";
NSAppleScript* emptyTrashScript = [[NSAppleScript alloc] initWithSource:appleScriptString];

[emptyTrashScript executeAndReturnError:nil];
[emptyTrashScript release];

答案 1 :(得分:4)

您可以使用NSWorkspace将内容放入垃圾箱,但删除垃圾箱对于程序来说是不可能的,因此您不会找到API。所以你最好的选择是使用ScriptBridge。

ScriptingBridge.framework添加到构建目标,并使用以下命令为Finder生成头文件:

sdef /System/Library/CoreServices/Finder.app/ | sdp -fh --basename Finder

然后你可以让Finder提示用户清空垃圾桶:

#import "Finder.h"

FinderApplication *finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.Finder"];

// activate finder
[finder activate];

// wait a moment (activate is not instant), then present alert message
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  [finder emptySecurity:security];
});

有关详细信息,请参阅Scripting Bridge documentation


从Xcode 7.3开始,如果您使用Swift尝试此操作,您将在尝试查找Finder.h中定义的类时遇到链接器错误。所以你必须创建一个Objective-C包装器。