这段代码并不难,但需要使用已经被弃用的FSRef才能完成。尽管如此,在10.9版本中仍然可用。你需要与CoreServices链接才能使用。
int main(int argc, const char * argv[]) {
@autoreleasepool {
if (argc != 2) {
printf("quarantine <path>\n");
exit(1);
}
NSString *path = @(argv[1]);
OSStatus result;
FSRef pathRef;
result = FSPathMakeRef((UInt8*)[path UTF8String], &pathRef, 0);
if (result != noErr) {
NSLog(@"Error making ref (%d): %s", result, GetMacOSStatusCommentString(result));
exit(result);
}
NSDictionary *quarantineProperties = @{(__bridge id)kLSQuarantineTypeKey: (__bridge id)kLSQuarantineTypeOtherDownload};
result = LSSetItemAttribute(&pathRef,
kLSRolesAll,
kLSItemQuarantineProperties,
(__bridge CFTypeRef)quarantineProperties);
if (result != noErr) {
NSLog(@"Error setting attribute (%d): %s", result, GetMacOSStatusCommentString(result));
}
exit(result);
}
return 0;
}
另一种方法是将隔离信息从一个文件复制到另一个文件。您可以像这样序列化xattr信息:
xattr -p com.apple.quarantine file > file.xattr
您可以像这样将这些属性应用到另一个文件中:
xattr -w com.apple.quarantine "`cat file.xattr`" file
这应该可以工作,但我没有特别测试过隔离。我使用类似的技术保存代码签名并重新应用它们。
xattr -w
写入确实有效。 - Ted Middleton