我试过了:
检查FSCatalogInfo
nodeFlags
以查看是否设置了kFSNodeForkOpenBit
(使用kFSNodeForkOpenMask
)。
检查创建者代码是否介于kFirstMagicBusyFiletype
和kLastMagicBusyFiletype
之间。
检查ExtendedFileInfo
extendedFinderFlags
以查看是否已设置kExtendedFlagObjectIsBusy
。
从shell运行GetFileInfo -ab
。
所有这些都报告说Finder正在复制的文件是而不是打开。
使用lsof
确实检测到该文件已打开,但是(a)我不想从我的应用程序中调用lsof
,并且(b)我的理解是它依赖于私有API因此,查看其来源无济于事。
答案 0 :(得分:6)
对你来说现在已经晚了2年了,但我想为了后来发现这个问题的人我会注意到你可以查看文件的创建日期。在复制时,Finder将其设置为kMagicBusyCreationDate(1946-02-14 08:34:56 +0000)。
答案 1 :(得分:3)
在Mac OS X v10.4及更高版本中:
虽然Finder推进了文件的副本(之后没有),但副本有:
brok
MACS
- 这两件事表示文件业务。
MACS
是ID of Finder。
虽然Finder推进了文件的副本(之后没有),但副本有一个副本:
._
文件。Why are dot underscore ._ files created, and how can I avoid them? - 提出不同的
如果使用Finder的副本被非正常中断,则brok
MACS
的存在应确保破产/业务可识别:
没有扩展属性的文件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 ..
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
删除了扩展属性:
[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呼叫时,您会看到这些呼叫。 您可以在这些调用中找到工作函数。不幸的是,它们没有很好的记录。 希望有所帮助。