2011-03-17 5 views
2

ごみ箱の内容をプログラムで空にする方法があるのだろうかと思いました。 、Objective-C/Cocoa経由でごみ箱を空にする

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

をしかし、私はこの作業、私はゴミ箱にファイルをドラッグするたびに使用した後、私は、メッセージが表示しています:私は、現在使用してそこにあるファイルを削除してい

"xxxxxx.xxx"を削除しますか?このアイテムは即座に削除されます この アクションを元に戻すことはできません。

これは、私がログアウトするか、sudo rm -rfをゴミ箱にするまで続きます。

ありがとうございます!

+0

なぜこれを行う必要がありますか?ごみ箱はユーザーの領域であり、あなたのアプリは本当にそれを乱すべきではありません。 –

答えて

3

あなたはNSWorkspaceでゴミ箱にものを置くことができる、しかし、ゴミ箱を削除するなしなしプログラムのための一種でありますAPI。だからあなたの最善の策はScriptBridgeを使うことです。

ビルドターゲットにScriptingBridge.frameworkを追加し、使用してファインダー用のヘッダファイルを生成します。そして、あなたがごみ箱を空にするを促すためにファインダーを依頼することができ

sdef /System/Library/CoreServices/Finder.app/ | sdp -fh --basename 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ラッパーを作成する必要があります。

+0

サンドボックスについてはどうですか? –

+0

アプリがサンドボックス化されている場合は、スクリプト権限が必要です。 – jbtule

+1

しかし、あなたのアプリがサンドボックス化されている場合、なぜゴミ箱を空にする必要がありますか?質問を始めます。 – jbtule

3

あなたはそれを行うには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]; 
+0

ありがとう!一度に1つのファイルを作成する方法はありますか?私はコールバックメソッドでファイルを個別に削除しています。それぞれのファイルに対してチェックを行い、削除してから次のファイルに移動します。 – minimalpop

+0

すでにゴミ箱に入っていますか?一度に1つのファイルを空にすることはできません。しかし、おそらくあなたのチェックを行い、ファイルを削除し、処理が完了したらゴミ箱を空にすることができます。別の方法として、ゴミ箱にあるファイルをループし、ゴミ箱から削除したくないファイルを移動することもできますが、それは少し生産的ではありません。 – David

関連する問題