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:kMDItemDownloadedDate
和 com.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