iOS Dropbox API : 如何区分文件夹和文件包?

iOS Dropbox API : how to tell folders from file packages?

我正在使用 Dropbox iOS API v2。当尝试从文件中挑选文件夹时,作为包的文件(即首选项文件或 xcodeproject 文件、.framework 等)显示为文件夹类型。有没有办法区分文件夹和文件包?

DBFILESMetadata * metaData = ...;
if ([metaData isKindOfClass:[DBFILESFileMetadata class]]) {
    // is a file
} else if ([metaData isKindOfClass:[DBFILESFolderMetadata class]]) {
    // is a folder or file package
} else if ([metaData isKindOfClass:[DBFILESDeletedMetadata class]]) {
    // has been deleted
}

如果设置了 'bundle' (B) 位,则应将其视为一个包,而不是单个文件。但是,并非所有 'packages' 都是 'bundles'。

参见:How do I flag a folder as being a package?

如果安装在设备上的应用程序使用该包,则该应用程序应在系统中注册其扩展名,以将其标识为包文件夹而不是普通文件夹。但是,我不确定您是否可以将这些识别为来自未注册该特定类型的应用程序的软件包。

参见:https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/DocumentPackages/DocumentPackages.html

如果这个包不是一个包,并且有一个没有被当前设备上安装的应用程序注册的扩展,那么我认为没有任何方法可以确定是准确的,你的工作周围的 has-a-filename-extension 可能是您唯一可以做的事情。

这就是我的结局。

DBFILESMetadata * metaData = ...;
if ([metaData isKindOfClass:[DBFILESFileMetadata class]]) {
    // is a file
} else if ([metaData isKindOfClass:[DBFILESFolderMetadata class]]) {
    if ([[metaData.name pathExtension] isEqualToString:@""] == NO) {
        // is a file package / bundle
    } else {
        // is a folder 
    }
} else if ([metaData isKindOfClass:[DBFILESDeletedMetadata class]]) {
    // has been deleted
}