我需要找出Cocoa應用程序中的diskutil的路徑。在終端中,如果我輸入'哪個diskutil',它會給我:'/ usr/sbin/diskutil /'。它會永遠是這條道路嗎?如果沒有,我怎麼能編程找出路,因爲我需要用NSTask找到diskutil的路徑
使用感謝
我需要找出Cocoa應用程序中的diskutil的路徑。在終端中,如果我輸入'哪個diskutil',它會給我:'/ usr/sbin/diskutil /'。它會永遠是這條道路嗎?如果沒有,我怎麼能編程找出路,因爲我需要用NSTask找到diskutil的路徑
使用感謝
嘗試/usr/sbin/diskutil
。如果未找到,請獲取$ PATH中的路徑列表:
[[[NSProcessInfo processInfo] environment] objectForKey:@"PATH"]
並使用NSFileManager在它們的每一個上查找命令diskutil
。如果用戶有權訪問,您的應用程序將會找到它。
一個不尋常的情況是該命令不在默認的系統位置,用戶與他的PATH混淆。然後,您可以在某些位置(/ opt/local/bin,/ usr/local/bin,...)對查找進行硬編碼,或詢問用戶它在哪裏。
您可以使用env
命令爲您完成工作。簡單地說,「env diskutil blah blah blah
」和env
將在用戶的PATH
的目錄中查找diskutil
,如果發現它,請使用其餘參數運行它。
對於NSTask,這意味着您需要將任務的啓動路徑設置爲/usr/bin/env
,並將其參數數組設置爲命令(diskutil
)及其參數;例如,[NSArray arrayWithObjects:@"diskutil", @"list", @"-plist", nil]
。
當您運行這樣的任務,它將運行env
,這將exec
diskutil
反過來,所以你會間接地運行任何diskutil
的env
程序認定,而不必尋找diskutil
自己。
您可能需要使用PRHTask,這是我寫的NSTask的替代品,可以自動執行此操作以及其他一些操作。使用PRHTask,您可以在一行中創建diskutil
任務:[PRHTask taskWithProgramName:@"diskutil" arguments:@"list", @"-plist", nil]
。 (當然,您仍然需要運行它;還有一些其他好的功能可能會在開始之前打開,詳情請參閱wiki頁面。)
我不確定我喜歡這種方法:取決於在用戶的環境中,程序最終可能會運行'diskutil'可執行文件,但不一定是系統'diskutil'。雖然應用程序可以在系統卷內和捲上自由移動,但應該總是在/ usr/bin中,替換/ usr/bin/diskutil需要管理權限。 – 2011-11-17 23:34:16
@Bavarious:任何搜索搜索路徑的解決方案都是如此。更安全但更脆弱的選擇是假設'diskutil'總是處於某個位置(當前是'/ usr/sbin',而不是'/ usr/bin')。 –
哎呀,'是一個錯字! – 2011-11-17 23:47:16