有什么我不理解fileExistsAtPath:isDirectory方法吗?

时间:2013-07-15 02:45:52

标签: objective-c cocoa-touch cocoa

我不明白这种方法是如何工作的。这是代码

BOOL isDir = NULL;
BOOL returnVal;
path = @"/Users/me/Desktop/kkk";
returnVal = [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];

以下是结果:

1)kkk是一个文件

returnVal = NO
isDir     = NO

2)kkk是一个空目录

returnVal = YES
isDir     = YES

场景#2似乎按预期工作,但根据文档:

path
The path of a file or directory. If path begins with a tilde (~), it must first be expanded with stringByExpandingTildeInPath, or this method will return NO. 

isDirectory
Upon return, contains YES if path is a directory or if the final path element is a symbolic link that points to a directory, otherwise contains NO. If path doesn’t exist, this value is undefined upon return. Pass NULL if you do not need this information.

因此对于场景#1,结果不应该如下?

returnVal = YES
isDir     = NO

1)修改 对于以下评论。

但文件确实存在。我手动创建文件来测试它。大声笑。它只有一个包含4行代码的程序。我在桌面上都有文件/文件夹。首先我把一个名为“kkk”的文件放入(没有扩展名)然后我删除文件并在那里放置一个名为“kkk”的文件夹。它适用于文件夹,但不适用于文件。有趣的是,如果文件具有扩展名,则可以使用。那么没有扩展名的文件有什么问题吗? (你们还没有能够在没有扩展的情况下重现它吗?)

2)编辑

感谢您帮助我解决这些问题。我的Mac设置为显示文件的扩展名。但似乎Mac是一种奇怪的行为。我选择文件“kk.plist”,然后将文件重命名为“kk”,如图所示。一旦我这样做,Mac OSx会自动选择隐藏扩展选项。因此,当我认为该文件是“kk”时,它仍然是“kk.plist”,其扩展名已隐藏。如您所见,两个文件具有相同的扩展名,一个是隐藏的,另一个不是。我没有意识到隐藏的扩展只能应用于一个文件。感谢。

enter image description here

1 个答案:

答案 0 :(得分:0)

  

1)kkk是一个文件

returnVal = NO
isDir     = NO
     

     

因此对于场景#1,结果不应该如下?

returnVal = YES
isDir     = NO

是。但是当你试图验证这种方法的结果时,要小心Finder隐藏你的东西。

正如您所发现的,一个例子是隐藏扩展:您提供了一个没有扩展名的路径,当它找不到您认为没有扩展名的文件时会感到惊讶;事实上,它仍然有一个扩展,Finder隐藏了,所以它仍然与路径不匹配,所以你得到的结果是正确的。

另一个例子是隐藏的(a.k.a。不可见)项目。对于在Finder中找不到的文件,您可能会得到YES的结果。 Go命令将暂时显示一个不可见的目录,但不会帮助您处理文件。

每当fileExists:isDirectory:的结果让您感到惊讶,并且Finder似乎显示结果有误时,请尝试ls终端中的路径:

ls -dl /path/to/item

如果该命令打印项目的描述,则它存在。如果它输出错误,那么它不会。您还可以从输出中判断该项目是否是目录。