如何判断文件或文件夹是否繁忙,例如Finder正在忙着复制它吗?

时间:2009-01-14 20:35:38

标签: macos

我试过了:

  1. 检查FSCatalogInfo nodeFlags以查看是否设置了kFSNodeForkOpenBit(使用kFSNodeForkOpenMask)。

  2. 检查创建者代码是否介于kFirstMagicBusyFiletypekLastMagicBusyFiletype之间。

  3. 检查ExtendedFileInfo extendedFinderFlags以查看是否已设置kExtendedFlagObjectIsBusy

  4. 从shell运行GetFileInfo -ab

  5. 所有这些都报告说Finder正在复制的文件是而不是打开。

    使用lsof确实检测到该文件已打开,但是(a)我不想从我的应用程序中调用lsof,并且(b)我的理解是它依赖于私有API因此,查看其来源无济于事。

5 个答案:

答案 0 :(得分:6)

对你来说现在已经晚了2年了,但我想为了后来发现这个问题的人我会注意到你可以查看文件的创建日期。在复制时,Finder将其设置为kMagicBusyCreationDate(1946-02-14 08:34:56 +0000)。

答案 1 :(得分:3)

文件业务

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

Finder和数据完整性

虽然Finder推进了文件的副本(之后没有),但副本有:

  • HFS类型代码brok
  • HFS创建者代码MACS

- 这两件事表示文件业务

MACSID of Finder

如果副本是不支持

等属性的文件系统

虽然Finder推进了文件的副本(之后没有),但副本有一个副本:

  • 包含必要扩展属性(xattr)的点下划线._文件。

相关

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

Finder与各种文件系统和操作系统的兼容性

如果使用Finder的副本被非正常中断,则brok MACS的存在应确保破产/业务可识别

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

实施例

没有扩展属性的文件big file.dmg

在从JHFS +复制到使用MS-DOS(FAT32)的卷上的空example目录之前:

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:24:29 BST
[macbookpro08:~] gjp22% ls -h@al /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 -h@al /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 ..

使用Finder开始复制后,完成

扩展属性brokMACS的值中的

com.apple.FinderInfo

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:25:08 BST
[macbookpro08:~] gjp22% ls -h@al /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
-rwxrwxrwx@ 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

Finder成功完成复制后

删除了扩展属性:

[macbookpro08:~] gjp22% date
Fri 11 May 2012 17:29:19 BST
[macbookpro08:~] gjp22% xattr -l /Volumes/FAT32/example/bigfile.dmg
[macbookpro08:~] gjp22% ls -h@al /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

答案 2 :(得分:2)

在我看来,部分复制的文件的文件类型为“brok”,创建者代码为“MACS”。

我不相信Finder会以任何方式标记正在制作的文件夹副本。 “灰显”表示严格限于正在进行复制的Finder进程。您可以在文件夹复制时使用快速用户切换来验证这一点:作为其他用户,正在复制的文件夹在Finder中具有正常外观,您可以打开它并观看子文件和文件夹。 Finder似乎没有通过AppleScript揭示有关该文件夹的任何差异,我想不出任何其他方式来获取该信息。

答案 3 :(得分: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
}

我从来没有尝试使用Finder复制的文件,但是当系统上的另一个应用程序打开文件时它确实有效。如果你以只读方式而不是读/写方式打开它,我不确定这个方法是否有效,因此根据你的要求,这可能是另一个问题。

答案 4 :(得分:0)

我不知道确切的答案但是...在POSIX和Carbon文件mgr API之下,两者都使用了另一个层。它非常接近VFS,并使用所有小写名称。使用命令“fs_usage”,IIRC追踪FS呼叫时,您会看到这些呼叫。 您可以在这些调用中找到工作函数。不幸的是,它们没有很好的记录。 希望有所帮助。