NSFileManager更改文件所有者/权限

时间:2014-06-20 12:01:48

标签: objective-c macos file permissions plist

我有一个在root下运行的应用程序并更改了一些由用户创建的文件。 问题是在使用我的应用程序编辑文件后,它会成功保存,但会更改文件的所有者。 所以在编辑文件之前是:

-rw-------@ 1 myusername  wheel  2418 Jun 18 18:29 myfile.plist 

编辑后:

-rw-------@ 1 root  wheel  2418 Jun 18 18:29 myfile.plist

以下是我编辑文件的代码:

NSMutableDictionary* myFile = [NSMutableDictionary dictionaryWithContentsOfFile:@"myFile.plist"];
[myFile setObject:@"some text" forKey:@"some key"];
BOOL result = [myFile writeToFile:@"myFile.plist" atomically:YES];

即使在root下使用app进行编辑,我也需要保留文件的所有者。 我怎样才能解决上面的问题?

编辑:我尝试了以下代码并返回成功结果,但没有更改权限:

NSDictionary *properties = [[NSFileManager defaultManager] attributesOfItemAtPath:@"myfile.plist"
                                                                            error:nil];

NSMutableDictionary *newProperties = [NSMutableDictionary dictionaryWithDictionary:properties];
[newProperties setObject:@"myusername" forKey:NSFileOwnerAccountName];

NSError *error = nil;

BOOL result = [[NSFileManager defaultManager] setAttributes:newProperties
                                               ofItemAtPath:@"myfile.plist"
                                                      error:&error];

2 个答案:

答案 0 :(得分:1)

我相信只有attributesOfItemAtPath才接受NSNumber对象的权限。请尝试使用AccountID:( NSFileOwnerAccountID 和/或 NSFileGroupOwnerAccountID ):

NSMutableDictionary *newProperties = [NSMutableDictionary dictionaryWithDictionary:properties];
            [newProperties setObject:[NSNumber numberWithInt:0] forKey:NSFileOwnerAccountID];

来自Apples文档

  

NSFilePosixPermissions值必须初始化为   表示POSIX文件权限位模式的代码,其中   相应的值是NSNumber对象。

参考:NSFileOwnerAccountID

答案 1 :(得分:0)

您可以使用setAttributes:ofItemAtPath:error:的{​​{1}}方法,其属性为NSFileManager

NSFileImmutable

希望这有帮助!