2009-01-14 49 views
5

我曾嘗試:如何判斷文件或文件夾是否忙碌Finder正忙着複製到它?

  1. 檢查FSCatalogInfonodeFlags,看是否kFSNodeForkOpenBit設置(使用kFSNodeForkOpenMask)。

  2. 檢查創建者代碼是否在kFirstMagicBusyFiletypekLastMagicBusyFiletype之間。

  3. 檢查ExtendedFileInfoextendedFinderFlags以查看kExtendedFlagObjectIsBusy是否已設置。

  4. 從shell運行GetFileInfo -ab

所有的這些報告中指出,取景器複製到該文件開放。

使用lsof確實檢測到文件已打開,但(a)我不想從我的應用程序調用lsof,並且(b)我的理解是它依賴於私有API,因此查看它的源代碼將不會幫助。

+0

只是好奇,你怎麼知道它使用專用API? – robottobor 2009-01-15 00:06:26

+0

蘋果郵件列表上的帖子。 – 2009-01-18 16:59:15

回答

6

現在對你來說已經有2年左右的時間了,但我想爲了後面的任何人的發現,我會注意到你可以檢查文件的創建日期。 Finder在複製時將其設置爲kMagicBusyCreationDate(1946-02-14 08:34:56 +0000)。

0

這種方法可能有點雜亂,但我用它來達到類似的目的,它可能適用於你。基本的想法是嘗試用排它鎖打開文件,檢查打開是否成功,然後立即關閉它。所以,這看起來是這樣的:

char* pathToFile; 
int result; 

result = open(pathToFile, O_RDWR | O_NONBLOCK | O_EXLOCK); 
if (result != -1) 
{ 
    //The file is not busy 
    close(result); 
} 
else 
{ 
    //The file is busy 
} 

我從來沒有與文件正由搜索複製嘗試這樣做,但它的工作,當一個文件系統上的其他應用程序打開。我不確定這種方法是否工作,如果你打開它作爲只讀而不是讀/寫,所以這可能是另一個問題,取決於你的要求。

0

我不知道確切的答案,但... POSIX和Carbon文件mgr API下面還有另一個圖層,兩者都使用。它非常接近VFS,並使用所有小寫名稱。當您使用命令「fs_usage」,IIRC跟蹤FS呼叫時,您會看到這些呼叫。 您可能會在這些調用中找到工作函數。不幸的是,他們沒有很好的記錄。 希望有所幫助。

2

在我看來,部分複製文件的文件類型爲「brok」,創建者代碼爲「MACS」。

我不相信Finder會以任何方式標記它正在製作的文件夾的副本。 「灰色」表示嚴格限於正在進行復制的Finder進程。您可以在複製文件夾時使用「快速用戶切換」來驗證此操作:作爲其他用戶,正在複製的文件夾在Finder中具有正常外觀,您可以打開它並觀看子文件和文件夾的顯示。 Finder似乎也沒有透過AppleScript透露有關文件夾的任何差異,我也想不出任何其他方式來獲取這些信息。

3

文件業務

在Mac OS X v10中。4及更高版本:

搜索和數據完整性

雖然搜索前進的文件的副本(未之後)的複製具有:

  • HFS類型代碼brok
  • HFS創建者代碼MACS

- 在一起,這兩件事表示文件業務

MACSID of Finder

如果複製到文件系統,而無需對屬性,比如那些支持

雖然搜索的進行文件的副本(不是之後)的複製具有對應:

  • 點下劃線包含必要的擴展屬性(xattr)的._文件。

相關

Why are dot underscore ._ files created, and how can I avoid them? - 向不同

搜索兼容性與廣泛的文件系統和操作系統

的如果使用查找副本被非正常中斷,則的brokMACS存在應確保破損/業務是可識別的到:

  • OS X的所有版本
  • 的Mac OS X
  • 的Mac OS 9的所有版本和操作系統的一些早期版本的經典。

的文件​​沒有擴展屬性。

之前從JHFS +複製到捲上的空example目錄使用MS-DOS(FAT32):

[macbookpro08:~] gjp22% date 
Fri 11 May 2012 17:24:29 BST 
[macbookpro08:~] gjp22% ls [email protected] /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg 
-rw-r--r-- 1 gjp22 staff 1.4G 11 May 17:20 /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg 
[macbookpro08:~] gjp22% xattr /Users/gjp22/Documents/uk/ac/brighton/collaborate/bigfile.dmg 
[macbookpro08:~] gjp22% diskutil list | grep FAT32 
    1:     DOS_FAT_32 FAT32     2.0 GB  disk3s1 
[macbookpro08:~] gjp22% ls [email protected] /Volumes/FAT32/example 
total 16 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 17:24 . 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 11:32 .. 

值的範圍內使用查找器來開始複製,完成

brokMACS前後擴展屬性com.apple.FinderInfo的:

[macbookpro08:~] gjp22% date 
Fri 11 May 2012 17:25:08 BST 
[macbookpro08:~] gjp22% ls [email protected] /Volumes/FAT32/example 
total 311320 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 17:25 . 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 11:32 .. 
-rwxrwxrwx 1 gjp22 staff 4.0K 11 May 17:25 ._bigfile.dmg 
[email protected] 1 gjp22 staff 152M 11 May 17:25 bigfile.dmg 
    com.apple.FinderInfo  32B 
[macbookpro08:~] gjp22% xattr -l /Volumes/FAT32/example/bigfile.dmg 
com.apple.FinderInfo: 
00000000 62 72 6F 6B 4D 41 43 53 00 00 00 00 00 00 00 00 |brokMACS........| 
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000020 

搜索成功完成副本後

這擴展屬性被刪除:

[macbookpro08:~] gjp22% date 
Fri 11 May 2012 17:29:19 BST 
[macbookpro08:~] gjp22% xattr -l /Volumes/FAT32/example/bigfile.dmg 
[macbookpro08:~] gjp22% ls [email protected] /Volumes/FAT32/example 
total 3000016 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 17:29 . 
drwxrwxrwx 1 gjp22 staff 4.0K 11 May 11:32 .. 
-rwxrwxrwx 1 gjp22 staff 1.4G 11 May 17:20 bigfile.dmg