2013-06-05 166 views
7

我讀過很多關於UTI的博文和SO問題以及OS X如何處理文件類型。然而,仍然有一些東西我沒有得到:UTI從哪裏來?

  • 如何爲系統創建的每個文件的UTI?作爲開發人員,我被動地爲我的文件類型聲明UTI,但系統負責爲每個匹配文件分配UTI。 我目前的印象是,UTI是由Finder根據文件擴展名即時創建的。

  • UTI在哪裏存儲在文件系統級別?我知道UTI可以用mdls命令顯示。這是否意味着UTI是沿着Spotlight元數據存儲的?如果Spotlight關閉,該怎麼辦?

  • 是否正確,沒有API手動添加或更改特定文件的UTI?

+0

您是否閱讀過Apple的參考資料? https://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html –

+0

當然,我已閱讀參考。但它只解釋了UTI的結構以及如何在應用程序中聲明它們。我想知道的是他們如何在文件系統級別上工作。我更新了我的問題,使其更清晰一些。 – codingFriend1

回答

14

實際上沒有太多的魔力。你已經提出了幾個不同的問題,所以我會盡量給你每個答案:

系統爲每個文件如何創建UTI?

啓動服務維護Mac上所有應用程序(和某些其他類型的軟件包)的數據庫以及在Info.plist文件中聲明的相關信息。它自動更新這些信息 - 我認爲它有一個守護進程監視文件系統以監視應用程序的變化,但我不知道細節。我所知道的是你可以問一個名爲lsregister的工具來爲你轉儲整個數據庫。在山獅終端:

$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump 

各種UTType功能還可以訪問這個發射服務數據庫(雖然我不知道,如果他們直接做到這一點,或者如果他們以某種守護的是它會爲他們進行溝通) 。

UTI在哪裏存儲在文件系統級別?

那麼,實際的啓動服務數據庫似乎位於每個Mac上不同的地方。在我的,它似乎在/private/var/folders/mf/1xd7vlw90dj5p4z1r5f800bc000101/C/com.apple.LaunchServices-0371025.csstore。 (至少,lsregister在它正在運行時保持此文件處於打開狀態;實際上我不確定它裏面是什麼,但我認爲它是數據庫。)

雖然這只是已聲明的UTI的列表。沒有UTI字段附加到給定的文件。當你向可可申請一個文件的UTI-through時,比如-[NSWorkspace typeOfFile:error:]-[NSURL getResourceValue:forKey:error:]-它實際上是從文件名中提取路徑擴展名,然後調用UTTypeCreatePreferredIdentifierForTag()來獲取相關的UTI。 (這比這更復雜一點,因爲它也在查看路徑是否會導致目錄或設備文件或其他內容,但這是基本想法。)

這是否意味着UTI是沿着Spotlight元數據?如果Spotlight關閉,該怎麼辦?

聚光燈確實將UTI文件保存在其數據庫中,但這只是它可以快速搜索和按類型過濾。與Spotlight索引中的其他所有內容一樣,此信息不是規範的;它只是用來快速搜索實際存儲在別處的數據。如果關閉聚光燈,那很好 - 沒有別的依賴它。

是否正確,沒有API手動添加或更改特定文件的UTI?

是的,因爲該UTI是在運行時從其他有關該文件的信息計算出來的。改變一個文件的UTI與改變它的名字長度一樣重要 - 你不能在不改變名字本身的情況下做到這一點。

+0

謝謝!這就是我想知道的。 – codingFriend1