2009-03-01 38 views
1

有沒有什麼辦法找出IconRef引用或已經加載的圖標文件?或者甚至包含捆綁的ID(如果有的話)?IconRef文件來自

據我所知,並非所有的圖標都直接從文件(例如複合圖標)加載,所以這不會一直工作。

我試圖回答的問題是「Finder將顯示文件X的圖標源自哪裏?」請注意,我對文件系統中圖標的來源感興趣,而不是圖標的圖像數據。據我所知,從文件路徑到圖標背後的工作 - 例如。 GetIconRefFromFileInfo和NSWorkspace.iconForFile - 相當不透明。

如果這是需要的,我願意接受無證/私人解決方案。

@millenomi: 是的,避免蘋果的圖標是練習的要點。

回答

0

這是因爲,一旦加載,系統不會保留對圖標來自的圖標文件的引用。

不幸的是,您最好的辦法是在/System中搜索*.icns文件。請注意,這些圖標在Apple的版權下,您不應該重複使用它們(除非通過API加載)。

1

啓動服務具有用於遍歷其捆綁註冊數據庫的私有API,您可以通過這種方式找到這些文件。您可以使用LaunchServices.framework/Support中的lsregister工具查看此信息;使用lsregister -dump查看完整的數據庫。

強制UntocumentedGoodness警告:如果您使用這些函數,您的應用程序遲早會中斷。 (並解析lsregister -dump的輸出是一個更糟糕的主意!)

另外,你似乎意識到這一點,但我會指出它:不是所有的圖標都來自一個圖標文件。有些文件位於資源文件中,例如舊式Carbon應用程序。另一種情況是自定義(粘貼到Finder的「信息」窗口中)圖標,它們是ID -16455的一個或多個資源。 (古典圖標有'icl8','ics8'等多種資源,而現代圖標在'icns'類型的單一資源中。)

不幸的是,我還沒有玩過這個私人API ,所以我不能更具體。

+0

曾幾何時,有一個UndocumentedGoodness函數`_LSCopyAllApplicationURLs(&urls)`。這似乎已經消失。有誰知道它去了哪裏? – 2009-03-01 23:47:53

0

回答自己...

下不會達到原來的問題 - 找出哪些文件是IconRef落後 - 但它確實實現我的蘋果,避免國有圖標的目標不放棄具體的文件圖標共。

訣竅是確定哪個應用程序將打開該文件,並假定該應用程序將提供該文件的圖標。

使用LSGetApplicationForItem來找出哪個應用程序將用於打開文件。如果它不是Apple應用程序(檢查包ID),我認爲使用文件圖標是安全的(由GetIconRefFromFileInfo返回)。

我還需要處理一些特殊情況 - 避免使用通用文檔,文件夾,應用程序和軟件包圖標以及「特殊」文件夾,如文檔和音樂。