我正在尝试使用以下代码在文件头中写入一些数据(数据长度为 367 字节):
const char *attrName = [kAttributeForKey UTF8String];
const char *path = [filePath fileSystemRepresentation];
const uint8_t *myDataBytes = (const uint8_t*)[myData bytes];
int result = setxattr(path, attrName, myDataBytes, sizeof(myDataBytes), 0, 0);
当我尝试阅读它时,结果不同:
const char *attrName = [kAttributeForKey UTF8String];
const char *path = [filePath fileSystemRepresentation];
int bufferLength = getxattr(path, attrName, NULL, 0, 0, 0);
char *buffer = malloc(bufferLength);
getxattr(path, attrName, buffer, bufferLength, 0, 0);
NSData *myData = [[NSData alloc] initWithBytes:buffer length:bufferLength];
free(buffer);
有人能告诉我怎样才能使这项工作正常进行吗?提前致谢。
最佳答案
这是一个方便的 NSFileManager category获取和设置 NSString 作为文件的扩展属性。
+ (NSString *)xattrStringValueForKey:(NSString *)key atURL:(NSURL *)URL
{
NSString *value = nil;
const char *keyName = key.UTF8String;
const char *filePath = URL.fileSystemRepresentation;
ssize_t bufferSize = getxattr(filePath, keyName, NULL, 0, 0, 0);
if (bufferSize != -1) {
char *buffer = malloc(bufferSize+1);
if (buffer) {
getxattr(filePath, keyName, buffer, bufferSize, 0, 0);
buffer[bufferSize] = '\0';
value = [NSString stringWithUTF8String:buffer];
free(buffer);
}
}
return value;
}
+ (BOOL)setXAttrStringValue:(NSString *)value forKey:(NSString *)key atURL:(NSURL *)URL
{
int failed = setxattr(URL.fileSystemRepresentation, key.UTF8String, value.UTF8String, value.length, 0, 0);
return (failed == 0);
}
关于ios - 写入扩展文件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400288/