2009-10-20 71 views
4

我想使用一个打开的面板让用户选择一个目的地,但我想在那个时候提醒他们该目录不可写。我通常更喜欢创建它并处理错误,但这对我并不有用,因为我不想创建该文件夹。 (如果有的话,我一定会处理这个错误。)如何判断一个目录是否可以在Objective-C中写入?

我认为可能有更好的方法,而不是创建它并删除它,这会很臭。

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

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

(我还没有确定,如果我想提供机会来验证覆盖的权限,但随时告诉我怎么了。)

+0

我没想到的面板甚至可以让你选择一个人迹罕至的目的地,但现在回想起来,我不知道,如果不我曾经真的测试过。 – 2009-10-20 22:37:11

+0

它绝对可以让你选择一些不可写的东西。 – zekel 2009-10-21 14:26:54

回答

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]; 
+0

@inkjet感谢您了解它为什么在某些时候工作。 – zekel 2014-08-14 17:58:37

3

你想

-attributesOfItemAtPath:error:. 

- jcr

+0

这是否意味着我必须查看filePosixPermissions,fileGroupOwnerAccountName,fileOwnerAccountName,NSUserName,并找出它自己? – zekel 2009-10-21 14:22:08

+0

对于NSURL对象,您可以检查NSURLIsWritableKey资源值。 – Jenn 2016-01-07 01:30:55

1

是的,目录算作文件。

+0

那么,这是否意味着如果[fm isWriteableFileAtPath:@“/ someDir /”]返回YES,我可以在该目录中创建文件? – Tom 2012-01-21 18:39:47

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

但它最终在实际的真实情况下工作吗? – Enchilada 2011-06-14 19:59:35

+0

是的,它为我工作。 – zekel 2012-04-11 17:25:27

相关问题