如何在 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 当然,除非你避免使用 @importing 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()的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中执行回调

如何在Windows上编译Objective-C

如何使用OCMock验证在Objective C中不调用异步方法?

如何在 iOS Swift 或 Objective C 中检测 iPhone 卷访问 [关闭]

在 Objective C 中调度块的执行

使用 XMPP 框架在 Objective C 中传输文件