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

如何判断目录在Objective-C中是否可写?,objective-c,cocoa,macos,file-io,Objective C,Cocoa,Macos,File Io,我想使用一个打开的面板让用户选择一个目的地,但我想在此时提醒他们目录不可写。我通常更喜欢创建它并处理错误,但这对我来说并不有用,因为我现在还不想创建文件夹。(如果有错误,我一定会在创建错误时处理它。) 我认为可能有一个更好的方法,而不是仅仅创建它并删除它,这会很糟糕 我试着这样做,认为“file”可能意味着像其他方法一样的文件或目录 NSFileManager *fm = [NSFileManager defaultManager]; [fm isWritableFileAtPath:desti

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

我认为可能有一个更好的方法,而不是仅仅创建它并删除它,这会很糟糕

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

NSFileManager *fm = [NSFileManager defaultManager];
[fm isWritableFileAtPath:destinationString]
(我还不确定是否要提供身份验证以覆盖权限的机会,但请随时告诉我如何操作。)

您想要吗

-attributesOfItemAtPath:error:.

-jcr

是的,目录计为文件。

编辑:看起来喷墨打印解决了我得到不一致结果的原因。把他的答案标记为正确答案


奇怪。我以前尝试过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?

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

NSString* destinationString = [[panel URL] path];
[fm isWritableFileAtPath:destinationString];
您将得到一个destinationString,它不以“/”结尾,因此,
iswriteablefileatpath:
将测试是否可以写入名为“someDir”的文件而不是文件夹“someDir”

一个快速解决方法是:

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

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

[fm isWritableFileAtPath:destinationString];

我认为面板甚至不允许您选择不可访问的目标,但现在我想了想,我不知道我是否真的测试过。它肯定可以让您选择不可写的内容。这是否意味着我必须查看filePosixPermissions、fileGroupOwnerAccountName、fileOwnerAccountName、NSUserName,然后我自己弄清楚?对于NSURL对象,您可以检查NSURLIsWritableKey资源值。那么,这是否意味着如果[fm isWriteableFileAtPath:@”/someDir/“]返回YES,我可以在该目录中创建文件?@inkjet感谢您弄清楚为什么它有时会工作。