如何判断目标在Objective-C中是否可写?

时间:2009-10-20 22:01:41

标签: objective-c cocoa macos file-io

我想使用一个打开的面板让用户选择一个目的地,但我想在那一点提醒他们该目录是不可写的。我通常更喜欢创建它并处理错误,但这对我来说没用,因为我还不想创建文件夹。 (如果有的话,我肯定会在创建错误时处理错误。)

我认为可能有一种比创建它并删除它更好的方法,这会很臭。

我试过这样做,认为“文件”可能意味着文件或目录就像其他方法一样。

NSFileManager *fm = [NSFileManager defaultManager];
[fm isWritableFileAtPath:destinationString]

(我不确定我是否想提供身份验证来覆盖权限,但随时告诉我如何。)

4 个答案:

答案 0 :(得分:5)

编辑看起来像喷墨打算弄清楚为什么我得到的结果不一致。将他标记为正确的答案。


怪异。之前我尝试过isWriteableAtPath并且它似乎没有像我预期的那样工作,但是现在进行了隔离测试。

NSFileManager *fm = [NSFileManager defaultManager];
NSLog(@"%d /private/ writeable?", [fm isWritableFileAtPath:@"/private/"]);
NSLog(@"%d /Applications/ writeable?", [fm isWritableFileAtPath:@"/Applications/"]);
NSLog(@"%d /Users/MYUSERNAME/ writeable?", [fm isWritableFileAtPath:@"/Users/MYUSERNAME/"]);

打印

0 /private/ writeable?
1 /Applications/ writeable?
1 /Users/MYUSERNAME/ writeable?

答案 1 :(得分:3)

你想要

-attributesOfItemAtPath:error:.

-jcr

答案 2 :(得分:3)

目录的路径以“/”结尾。假设您的代码是:

NSString* destinationString = [[panel URL] path];
[fm isWritableFileAtPath:destinationString];

你最终会得到一个以“/”结尾的destinationString,因此isWritableFileAtPath:将测试写入名为“someDir”的文件的可能性,而不是文件夹“someDir”。

快速解决方法是:

NSString* destinationString = [[panel URL] path];

if (![destinationString hasSuffix:@"/"])
    destinationString = [destinationString stringByAppendingString:@"/"];

[fm isWritableFileAtPath:destinationString];

答案 3 :(得分:1)

是的,目录计为文件。