首页 > 代码库 > iOS6.1 & iOS 7 & iOS8 判断沙盒文件或者目录是否存在,以及判断是文件还是目录的一个隐藏问题
iOS6.1 & iOS 7 & iOS8 判断沙盒文件或者目录是否存在,以及判断是文件还是目录的一个隐藏问题
- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory
通常,iOS系统中判断文件或者目录是否存在,可以用上面这个API。
第二个参数 isDirectory是个传出参数, 用于返回,是文件还是目录。
一般两种情况会使用这个API
需求一、 判断文件或者目录是否存在
需求二. 判断path是文件还是目录
需求一、只要判断这个API的返回值,YES为存在,NO为不存在即可,isDirectory不需要判断
因为当传入参数 path不存在时, isDirectory返回的是 undefined, 如果不想要判断是否目录, 这个参数可传NULL。纵观网上的例子,判断文件或者目录是否存在时,同时也会判断这个参数的BOOL值。其实是错误的,因为还有第三个值undefined。
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.
尤其有意思的是,
当path看起来像是一个目录字符串时, iOS6和7和8,isDirectory返回的值不同。
iOS 6.1对这个的undefined,判断为NO,
而iOS7和8,返回YES
这个问题导致,如果使用isDirectory,在iOS6.1的系统中,是无法判断一个不存在 path, 它是一个文件或者文件夹。仅仅需要根据这个API的返回值判断即可
本文的分析,主要是解决iOS6与后续系统,对同一个API调用的细节处理。仅供参考。
需求二, 判断path是文件还是目录
根据需求一的分析
如果要判断path是文件还是目录,在iOS6.1中,需要确保path是存在的。那么实际应该是两步操作
第一次调用- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory,根据返回值,判断是否存在
如果存在,进行第二次调用。
第二次调用- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory,根据 isDirectory,判断是否是目录
以上分析仅供参考
iOS6.1 & iOS 7 & iOS8 判断沙盒文件或者目录是否存在,以及判断是文件还是目录的一个隐藏问题