Macos 如何判断文件或文件夹是否正忙,例如查找程序正忙着复制?

Macos 如何判断文件或文件夹是否正忙,例如查找程序正忙着复制?,macos,Macos,我试过: 检查FSCatalogInfonodeFlags以查看是否设置了kFSNodeForkOpenBit(使用kFSNodeForkOpenMask) 检查创建者代码是否介于kFirstMagicBusyFiletype和kLastMagicBusyFiletype之间 检查ExtendedFileInfoextendedFinderFlags以查看是否设置了kExtendedFlagObjectIsBusy 从shell运行GetFileInfo-ab 所有这些报告都表明查找程序复制到的

我试过:

  • 检查
    FSCatalogInfo
    nodeFlags
    以查看是否设置了
    kFSNodeForkOpenBit
    (使用
    kFSNodeForkOpenMask

  • 检查创建者代码是否介于
    kFirstMagicBusyFiletype
    kLastMagicBusyFiletype
    之间

  • 检查
    ExtendedFileInfo
    extendedFinderFlags
    以查看是否设置了
    kExtendedFlagObjectIsBusy

  • 从shell运行
    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及更高版本中:

    查找器和数据完整性 当Finder获取文件副本时(不是之后),副本具有:

    • HFS类型代码
      brok
    • HFS创建者代码
      MACS
    -这两件事合在一起意味着文件业务

    MACS
    是最新版本

    如果将副本复制到不支持以下属性的文件系统: 当Finder提供文件副本时(不是之后),副本有一个副本:

    • 包含必要扩展属性(xattr)的点下划线
      文件
    相关的 -问不同的问题

    Finder与各种文件系统和操作系统的兼容性 如果使用Finder的副本被意外中断,则出现
    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