Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 当没有这样的文件时,为什么NSFileManager在fileExistsAtPath上返回TRUE?_Iphone_Objective C_Xcode_Nsfilemanager - Fatal编程技术网

Iphone 当没有这样的文件时,为什么NSFileManager在fileExistsAtPath上返回TRUE?

Iphone 当没有这样的文件时,为什么NSFileManager在fileExistsAtPath上返回TRUE?,iphone,objective-c,xcode,nsfilemanager,Iphone,Objective C,Xcode,Nsfilemanager,NSFilemanager正在为以下内容返回true,此时不应存在任何此类文件。发生了什么事 if([myManager fileExistsAtPath:[[self documentsDirectory] stringByAppendingPathComponent:@"Music/songlist.txt"]]){ NSLog(@"file is there"); } 把这个打印出来,看看它是否符合你的期望 NSLog(@"Directory: %@", [[self doc

NSFilemanager正在为以下内容返回true,此时不应存在任何此类文件。发生了什么事

    if([myManager fileExistsAtPath:[[self documentsDirectory] stringByAppendingPathComponent:@"Music/songlist.txt"]]){

NSLog(@"file is there");

}

把这个打印出来,看看它是否符合你的期望

NSLog(@"Directory: %@", [[self documentsDirectory] stringByAppendingPathComponent:@"Music/songlist.txt"]];
另外,请检查您是否正确定义了myManager。

的文档似乎建议不要检查文件是否存在,而只是尝试读取文件并优雅地处理任何错误(例如,文件未找到错误)。您所描述的内容听起来不像是文档建议试图规避的竞争条件,但是如果您只是尝试加载文件,而不是检查文件是否存在,会发生什么情况?例如,您可以尝试以下操作:

NSError *error;
NSStringEncoding encoding;
NSString *fileContents = [NSString stringWithContentsOfFile:fileName
                                               usedEncoding:&encoding
                                                      error:&error];

if (fileContents == nil)
{
    NSLog (@"%@", error);
}
else
{
    NSLog (@"%@", fileContents);
}

如果您得到一个包含文件所有内容的字符串,那么文件显然就在那里。如果出现错误,则说明myManager出现了问题,这对我来说是正常的

 NSFileManager *myManager = [NSFileManager defaultManager];
NSString *documentsDirectory = NSHomeDirectory();

if([myManager fileExistsAtPath:[documentsDirectory stringByAppendingPathComponent:@"Music/songlist.txt"]]){

    NSLog(@"file is there");

}

如果您使用NSLog(@“%@,[[self documents directory]stringByAppendingPathComponent:@“Music/songlist.txt”]]),会得到什么结果;-也许文件路径有点错误?您是否在运行此代码之前创建了文件,而没有在运行此代码之前将其删除?它将返回true,我甚至重置了模拟器以清除所有文件。这仍然是真的。在我启动一个无法下载的文件之前,文件可能不存在,因为我没有连接到网络。它可能正在查看路径是否存在——而不是文件。什么是<代码> [自文档目录] < /代码>返回?这是一个可怕的解决方案,当你考虑大文件时。你不想仅仅为了检查大文件是否存在而将其加载到内存中=/@valheru:你已经错过了答案的要点。如果在尝试读取文件之前检查文件是否存在,则说明引入了竞争条件。最好的方法是尝试直接从文件中读取,如果读取失败,则适当地处理该错误。上面的示例只是一个将文件读入字符串的演示,但是还有许多其他更有效的方法来使用基础框架从文件读取数据。同样,正如我在回答中所说的,以上只是一个例子。谢谢你的澄清。我看到这个页面是因为我正在寻找一种方法来检查现有的文件(无需立即读取)以显示列表。因此,在这种情况下,当考虑较大的文件时,可能会影响性能。@valheru:如果您的程序只需要知道某个文件是否存在(例如锁文件或类似文件),那么您是正确的,如果您不关心其内容,那么尝试读取该文件将是毫无意义的(并且可能对性能有害)。在这种情况下,
fileExistsAtPath:
是一种方法。是的,我遇到了相同的竞争条件,我删除了一个文件,并过快地检查它是否存在,它仍然认为它存在。我可能最终会设置文件列表的内存缓存,或者尝试通过目录列表或其他方式进行检查。