NSFileManager 不会从 NSFileExtendedAttributes 读取 kMDItemWhereFroms

Posted

技术标签:

【中文标题】NSFileManager 不会从 NSFileExtendedAttributes 读取 kMDItemWhereFroms【英文标题】:NSFileManager doesn't read the kMDItemWhereFroms from NSFileExtendedAttributes 【发布时间】:2013-10-11 02:41:34 【问题描述】:

对于我正在运行的名为 SourceControl 的小程序,我正在尝试以下操作: 在计算机上的某个(现在从静态)路径读取文件(从 Internet 下载)。

主要思想是从下载文件的地方获取源代码。

像这样:

我已经尝试了一些代码,但我得到的是一个指向另一个对象的指针,这并不是我真正想要的......我想像这样显示实际的字符串: "http://www.sunjets.be/_images/boekingsengine/grevas1_nl.jpg"

获取NSFileExtendedAttributes 最终获取com.apple.metadata:kMDItemWhereFroms

int main(int argc, const char * argv[])


    @autoreleasepool 

        //Static path to my file/image
        NSString* myPath = @"/Users/Verbe/Klassieke_Oudheid.JPG";

        //creating the filemanager
        NSFileManager *filemgr = [[NSFileManager alloc]init];

        //if the path exists, whiii it exists!
        if ([filemgr fileExistsAtPath:myPath])
        
            NSLog(@"file exists!");

            //Set the fileattributes to the dictionary!
            NSDictionary *fileAttributes = [filemgr attributesOfItemAtPath:myPath error:
                                            nil];

            for (NSString* myKey in fileAttributes)
            
                if ([myKey isEqualToString:@"NSFileExtendedAttributes"])
                
                    NSLog(@"MyKey = %@ with attribute: %@",myKey, [fileAttributes objectForKey:myKey]);

                
            

        
        else
        
            NSLog(@"File does not exist!");
        


    return 0;

结果如下:

2013-10-11 04:23:32.167 CustomInit[1016:303] 文件存在! 2013-10-11 04:23:32.190 CustomInit[1016:303] MyKey = NSFileExtendedAttributes 带有属性: “com.apple.metadata:kMDItemDownloadedDate”= ; “com.apple.metadata:kMDItemWhereFroms”= ; “com.apple.quarantine”=; 程序以退出代码结束:0

请注意,com.apple.metadata:kMDItemDownloadedDatecom.apple.metadata:kMDItemWhereFroms 确实存在!

这是怎么回事,我该如何解决?

【问题讨论】:

那些看起来像 NSData 块,其格式可能没有记录。 【参考方案1】:

这些是元数据 (Spotlight) 属性,因此您应该使用元数据框架。 Create an MDItem with the URL to the file 和 ask that item for its value for the attribute。

像这样:

MDItemRef item = MDItemCreateWithURL(kCFAllocatorDefault, myFileURL);
NSArray *whereFroms = CFBridgingRelease(MDItemCopyAttribute(item, kMDItemWhereFroms));

无需 plist 解码。

【讨论】:

你能举个例子吗,@Peter? @BenVertonghen:看吧。 +1 看起来是一种更好的方法,因为它可以将“实施细节”排除在您的应用之外【参考方案2】:

[[fileAttributes objectForKey:myKey] objectForKey:@"com.apple.metadata:kMDItemWhereFroms"] 返回的值是苹果二进制 plist (bplist00)。使用NSPropertyListSerialization 类的propertyListFromData:mutabilityOption:format:errorDescription: 函数进行转换。

NSString* myPath = @"/Users/new/Downloads/TelephoneBill.pdf";

//creating the filemanager
NSFileManager *filemgr = [[NSFileManager alloc]init];

//if the path exists, whiii it exists!
if ([filemgr fileExistsAtPath:myPath])

    NSLog(@"file exists!");

    //Set the fileattributes to the dictionary!
    NSDictionary *fileAttributes = [filemgr attributesOfItemAtPath:myPath error:
                                    nil];

    for (NSString* myKey in fileAttributes)
    
        if ([myKey isEqualToString:@"NSFileExtendedAttributes"])
        
            NSLog(@"MyKey = %@ with attribute: %@",myKey, [fileAttributes objectForKey:myKey]);

            NSData *whereFromData = [[fileAttributes objectForKey:myKey] objectForKey:@"com.apple.metadata:kMDItemWhereFroms"];
            NSString *error;
            NSPropertyListFormat format;
            id plist = [NSPropertyListSerialization propertyListFromData:whereFromData
                                                     mutabilityOption:NSPropertyListImmutable
                                                               format:&format
                                                     errorDescription:&error];
            NSLog(@"plist %@",plist);
        
    


else

    NSLog(@"File does not exist!");
  



plist (
    "https://www.airtel.in/myaccount/BillGuide/RevamP/download?fileName=EA29BB",
    "https://www.airtel.in/myaccount/BillGuide/billSummary.action?param=myBillSummary&res=6DAED0342C197C"
)

【讨论】:

工作就像一个魅力,我欠你一个!所以它最终意味着之前吐出的代码是来自Apple本身的二进制plist......我们将在我们自己的Plist中赶上它,(与偏好列表相同的Plist还是其他东西?)无论如何谢谢很多! :) 是的,您可以将该数据写入文件。 [whereFromData writeToFile:@"/p.plist" atomically:YES];

以上是关于NSFileManager 不会从 NSFileExtendedAttributes 读取 kMDItemWhereFroms的主要内容,如果未能解决你的问题,请参考以下文章

目标c从NSFileManager文件路径加载AVAsset

如果文件存在,不要保存到文件 NSFileManager

NSFileManager 无法创建文件

NSFileManager 从服务器读取文件?

是否有类似 NSFileManager.enumeratorAtPath 的东西,它需要从递归中排除的目录列表?

视频并不总是导出到相机胶卷:NSFileManager 的 removeItemAtPath 非阻塞?