fileExistsAtPath为存在的目录返回NO

时间:2012-01-10 19:10:46

标签: objective-c ios

对于存在的目录,

fileExistsAtPath返回NO。如果我有以下代码:

NSURL *newDirectoryPath = ... // path does not begin with a tilda
                              // and is created using URLByAppendingPathComponent:isDirectory:

BOOL directoryExists = [self.fileManager fileExistsAtPath:[newDirectoryPath absoluteString]];
if (NO == directoryExists)
{
    BOOL ret = [self.fileManager moveItemAtURL:self.currentPresentationDirectoryPath toURL:newDirectoryPath error: &err];
    // ret is YES, err is nil

    directoryExists = [self.fileManager fileExistsAtPath:[newDirectoryPath absoluteString]];
}

即使刚刚使用moveItemAtURL创建了目录,fileExistsAtPath仍然返回NO。

我知道文档说明了这一点:

  

尝试根据当前的状态来预测行为   文件系统或文件系统上的特定文件不是   推荐的。这样做会导致文件出现异常行为   系统竞争条件。

但是我想了解这里的问题 - 如果我关闭应用并重新启动它,那么上面代码中fileExistsAtPath的第一次检查仍然返回NO,即使该目录之前已成功创建先前执行代码,我可以看到管理器中的目录,我也可以成功地读取目录等内容等。

P.S。没有fileExistsAtURL:方法吗?

1 个答案:

答案 0 :(得分:20)

如果您有NSURL-absoluteURL将无法返回NSFileManager的可用路径。它将返回带有file://前缀的绝对URL。例如:file:///path/to/file

而是尝试使用其他方法,例如-path。检查一下是否有效。

NSURL *myURL = /* some url */;
NSString *myPath;
BOOL exi;

myPath = [myURL path];
exi = [[NSFileManager defaultManager] fileExistsAtPath:myPath];
if(!exi) {
    NSLog(@"File does not exist");
}