1

当我使用以下代码获取特定文件的属性时:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attributes = [fileManager attributesOfItemAtPath:p error:nil];

是否有属性可以知道它是否是屏幕截图?

现在我正在使用这段尴尬的代码:

if ([fileExtension isEqualToString:@"png"]) {
  NSMutableArray *separatetFilename;
  separatetFilename = [NSMutableArray arrayWithArray:[fileName componentsSeparatedByString:@" "]]; /* screenshots have multiple spaces in their names, I split them up to use the information */

  if ([separatetFilename count] == 4) { /* screenshots names have 4 parts when splittet by spaces */
    if ([[separatetFilename objectAtIndex:0] isEqualToString:@"Bildschirmfoto"]) { /* Bildschirmfoto = Screenshot in German */
      /* Do Something */
    }
  }
}

使用此解决方案,我必须为“屏幕截图”字符串输入本地化字符串......我搜索了纪录片,但没有找到任何东西。是否有“isScreenshot”标志或我可以阅读的内容?

4

1 回答 1

1

您的问题“是否有“isScreenshot”标志或我可以阅读的内容?答案是“是”。

我知道有两种方法可以得到答案:

a) 询问 NSFile~Manager

b) 请求元数据。

您已经使用过:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *attributes = [fileManager attributesOfItemAtPath:p error:nil];

如果您现在查看这本词典的键,例如

NSLog( @"the keys: %@", [attributes allKeys] );

你会找到键@"NSFileExtendedAttributes*"。此键的值是一个字典,其键如com.apple.metadata:kMDItemIsScreenCapturecom.apple.metadata:kMDItemScreenCaptureType或 ...。这就是您所要求的。相应的值是具有二进制属性列表的 NSData 对象。评估这些 plist 给出类似1(它是一个屏幕截图)和window用于窗口屏幕截图或选择窗口的一部分。

查看元数据可以通过以下方式完成:

    MDItemRef item = MDItemCreate( kCFAllocatorDefault, (CFStringRef)p );

如果您只需要上述值,请使用相应的键创建一个列表(一个 NSArray):

NSArray *ary = [NSArray arrayWithObjects:
     @"kMDItemIsScreenCapture", @"kMDItemScreenCaptureType", nil];
NSDictionary *dict =
    (NSDictionary *)MDItemCopyAttributes( item, (CFArrayRef)ary );

并测试它返回的内容;

NSLog( @"the metadata are %@", dict );

在这种情况下,返回的值是 __NSCFBoolean(即 NSNumber)和 __NSCFString(即 NSString),这比二进制 plist 更易于使用。

于 2012-07-19T16:58:20.250 回答