Пустая мусорная корзина через объектив-C/какао
-
26-10-2019 - |
Вопрос
Мне было интересно, есть ли способ программно опустошить содержимое мусора. В настоящее время я удаляю файлы, которые находятся там, используя:
NSFileManager *manager = [NSFileManager defaultManager];
[manager removeItemAtPath:fileToDelete error:nil];
Однако после того, как я использую эту операцию, каждый раз, когда я перетаскиваю файл в мусор, мне предложено с сообщением:
Вы уверены, что хотите удалить «xxxxxx.xxx»? Этот элемент будет немедленно удален. Вы не можете отменить это действие.
Это длится до тех пор, пока я не выходит из входа, либо не в сумасшедшей мусорной корзине.
Спасибо!
Решение
Вы можете положить вещи в мусор с 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];
});
Увидеть Документация по сценарию Больше подробностей.
По состоянию на Xcode 7.3, если вы попытаетесь это с помощью Swift, вы получите ошибки линкера, пытаясь найти классы, определенные в Finder.h. Таким образом, вам придется создать обертку Objective-C.
Другие советы
Вы можете попробовать использовать 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];