Пустое мусорное ведро через Objective-C / Какао - PullRequest
4 голосов
/ 17 марта 2011

Мне было интересно, есть ли способ программно очистить содержимое корзины.В настоящее время я удаляю файлы, которые находятся там, используя:

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

Однако после использования этой операции каждый раз, когда я перетаскиваю файл в корзину, мне выдается сообщение:

Вы уверены, что хотите удалить «xxxxxx.xxx»? Этот пункт будет удален немедленно.Вы не можете отменить это действие.

Это продолжается до тех пор, пока я не выйду из системы или не выполню sudo rm -rf мусорное ведро.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Вы можете попробовать использовать 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];
4 голосов
/ 17 марта 2011

Вы можете положить вещи в корзину с помощью 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.

...