Macos 如何判断文件或文件夹是否正忙,例如查找程序正忙着复制?
我试过:Macos 如何判断文件或文件夹是否正忙,例如查找程序正忙着复制?,macos,Macos,我试过: 检查FSCatalogInfonodeFlags以查看是否设置了kFSNodeForkOpenBit(使用kFSNodeForkOpenMask) 检查创建者代码是否介于kFirstMagicBusyFiletype和kLastMagicBusyFiletype之间 检查ExtendedFileInfoextendedFinderFlags以查看是否设置了kExtendedFlagObjectIsBusy 从shell运行GetFileInfo-ab 所有这些报告都表明查找程序复制到的
FSCatalogInfo
nodeFlags
以查看是否设置了kFSNodeForkOpenBit
(使用kFSNodeForkOpenMask
)kFirstMagicBusyFiletype
和kLastMagicBusyFiletype
之间ExtendedFileInfo
extendedFinderFlags
以查看是否设置了kExtendedFlagObjectIsBusy
GetFileInfo-ab
使用
lsof
确实可以检测到文件已打开,但是(a)我不想从我的应用程序调用lsof
,并且(b)我的理解是它依赖于私有API,因此查看其源代码不会有帮助。此方法可能有点笨拙,但我已将其用于类似的目的,并且可能对您有用。基本思想是尝试用独占锁打开文件,检查打开是否成功,然后立即再次关闭。所以,这看起来像:
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复制文件,但当系统上的另一个应用程序打开文件时,它确实起作用。如果您以只读方式而不是读/写方式打开它,我不确定同样的方法是否有效,因此根据您的要求,这可能是另一个问题。我不知道确切答案,但。。。在POSIX和Carbon file mgr API下面,还有另一层供两者使用。它非常接近VFS,并且使用所有小写名称。当您使用命令“FS_usage”,IIRC跟踪FS调用时,您会看到这些调用。 您可能会在这些调用中找到一个有效的函数。不幸的是,它们没有很好的文档记录。
希望有帮助。在我看来,部分复制的文件的文件类型为“brok”,创建者代码为“MACS”
我不相信Finder会以任何方式标记它正在制作的文件夹副本。“灰显”表示严格限于执行复制的查找程序进程。您可以通过在文件夹复制时使用快速用户切换来验证这一点:作为其他用户,正在复制的文件夹在查找器中具有正常外观,您可以打开它并观察子文件和文件夹的显示。查找程序似乎也没有通过AppleScript显示文件夹的任何差异,我想不出任何其他方法来获取这些信息。现在对您来说已经晚了大约2年,但我想为了以后找到此文件的人,我要指出,您可以检查文件的创建日期。Finder在复制时将其设置为kMagicBusyCreationDate(1946-02-14 08:34:56+0000)。文件业务 在Mac OS X v10.4及更高版本中:
- 李>
- HFS类型代码
brok
- HFS创建者代码
MACS
MACS
是最新版本
如果将副本复制到不支持以下属性的文件系统:
当Finder提供文件副本时(不是之后),副本有一个副本:
- 包含必要扩展属性(xattr)的点下划线
文件。
brok
Mac
应确保破损/业务可识别到:
- 所有版本的OS X
- Mac OS X的所有版本
- Mac OS 9和该操作系统的一些早期经典版本
big file.dmg
从JHFS+复制到使用MS-DOS(FAT32)的卷上的空示例目录之前:
使用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
只是好奇你怎么知道它使用了一个私有API?在苹果邮件列表上发布。谢谢。这会检测到查找程序正在复制的文件。不幸的是,它不适用于当前进程没有写入权限的文件夹或文件。
[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