4

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

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

但是,使用此操作后,每次将文件拖到垃圾箱时,都会提示以下消息:

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

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

谢谢!

4

2 回答 2

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];
于 2011-03-17T03:23:32.487 回答
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 文档


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

于 2011-03-17T03:25:05.200 回答