如何在 Objective C 中执行 chmod()
Posted
技术标签:
【中文标题】如何在 Objective C 中执行 chmod()【英文标题】:How to perform chmod() in Objective C 【发布时间】:2015-02-13 04:24:13 【问题描述】:什么是C的等价物:
chmod(MY_FILE, 0777);
在目标 C 中?我正在尝试写入现有的锁定文件而不执行
chmod +x MY_FILE
在终端上。
【问题讨论】:
Objective-C 是 C 的超集。您可以在 ios/OSX 上运行的任何 C 代码,您只需将其复制粘贴到您的 Objective-c 文件中即可。 @Linuxios,除了int NSArray;
:-)
@paxdiablo 当然,除非你避免使用 @import
ing Cocoa.h、Foundation.h 等。但这将是一些相当无聊的 Objective-C!
【参考方案1】:
您可以使用可可来做到这一点。
NSTask *changePerms = [[NSTask alloc] init];
[changePerms setLaunchPath:@"/bin/chmod"];
NSArray *chmodArgs = [NSArray arrayWithObjects:@"666", @"/Users/abc/hello.txt", nil];
[changePerms setArguments:chmodArgs];
[changePerms launch];
这是使用 NSFileManager 类的另一种方式
NSDictionary* attr = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithShort:0766], NSFilePosixPermissions, NULL];
NSError *error = nil;
[[NSFileManager defaultManager] setAttributes:attr ofItemAtPath:@"/Users/abc/Desktop/test.txt" error:&error];
使用 system() 调用
system("chmod 777 /Users/abc/Desktop/test.txt");
希望这会有所帮助!
【讨论】:
你的第一个代码 sn-p 糟糕。当chmod()
随时可用时,对外部命令进行炮击真的是零点。
要么使用原始 C 代码,要么依赖于任何框架 API。我给出的两个选项都是使用框架。
使用[NSNumber numberWithUnsignedLong:___]
可能会更好,因为 chmod 可以处理更大的值。为了证明,对文件执行chmod u+s
,然后对其执行stat -r
,并查看第三个参数。 (至少它是我 Mac 上的第三个。)你会看到它比有符号空头可以容纳的数字(32768)和无符号空头可以容纳的数字(65535)更大。将相同的数字与 chmod 传递给另一个测试文件,你会看到 chmod 接受这个 unsigned long 值。【参考方案2】:
您可以使用 Cocoa 的-setAttributes:ofItemAtPath:error:
来完成这项工作。
[[NSFileManager defaultManager] setAttributes:@ NSFilePosixPermissions : @0666
ofItemAtPath:…
error:&error];
你当然需要这样做的权利。
【讨论】:
【参考方案3】:你可以使用C的chmod()
。
在终端输入man 2 chmod
获取文档及相关功能。
【讨论】:
恕我直言,@newbieMACUser 要求使用 ObjC 方式来执行此操作,而不是 C 方式,而 C 方式要求您执行库包含。对于 ObjC,Amin Negm-Awad's answer 更合适,并且不需要额外的包含,而不是使用默认的 Objective C 文件获得的标准基础内容。以上是关于如何在 Objective C 中执行 chmod()的主要内容,如果未能解决你的问题,请参考以下文章
如何使用OCMock验证在Objective C中不调用异步方法?