我想首先说这个代码块在实现之前工作并推出iOS 7
。
基本上我在NSCachesDirectory
中有一个我正在寻找的文件名,所以我创建了一个URL对象作为我的搜索项。然后我枚举目录(使用相同的NSFileManager对象)并查找彼此相等的文件名,这就是我知道文件存在的方式。
+ (BOOL)itemExistsInMemory:(NSString *)itemName
{ BOOL itemExists = NO;
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSArray *mySandboxDirs = [fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask];//get the directories for the application
NSURL *searchForURL = [[mySandboxDirs lastObject] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", itemName, FileNameAppendix]];//look for the specific file
NSArray *enumerator = [fileManager contentsOfDirectoryAtURL:[mySandboxDirs lastObject] includingPropertiesForKeys:[NSArray arrayWithObjects:NSURLNameKey, NSURLIsRegularFileKey, NSURLCreationDateKey, nil] options:NSDirectoryEnumerationSkipsHiddenFiles error:nil];
for(NSURL *url in enumerator)
{//find out if any of the URLs within the NSCachesDirectory match what we're looking for
NSNumber *isRegularFile = nil;
[url getResourceValue:&isRegularFile forKey:NSURLIsRegularFileKey error:NULL];
if([isRegularFile boolValue])
{
if([url relativeString] isEqualToString:[searchForURL relativeString]])
{
itemExists = YES;
break;
}
}
}
return itemExists;
}
NSCachesDirectory
中的文件已被定义存在,但是,代码找不到它,因为searchForURL对象是在没有路径组件的情况下创建的(路径组件是私有/ ...)。为什么?更奇怪的是,我将数据保存到使用
[[mySandboxDirs lastObject] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", itemName, FileNameAppendix]];
指令!因此它不包含URL中的private / path组件,但是当我使用[NSData writeToURL:]写入数据时,它会将其“重定向”到private /目录。
那么为什么[NSFileManager URLsForDirectory: inDomains:]
无法为我NSCachesDirectory
找到正确的目录?
更多信息已从评论中移出以获得更好的格式:
顺便说一句,这是我正在创建和寻找的网址中包含的内容的示例 - >
当我创建用于保存的URL时:
file:///var/mobile/Applications/C63B378E-5EBE-417C-A465-8C3A3DCE013A/Library/Caches/Experimental%20Post.cnt
当我创建用于搜索的网址时:
file:///var/mobile/Applications/C63B378E-5EBE-417C-A465-8C3A3DCE013A/Library/Caches/Experimental%20Post.cnt
调查员看到了什么:
file:///private/var/mobile/Applications/C63B378E-5EBE-417C-A465-8C3A3DCE013A/Library/Caches/Experimental%20Post.cnt
我可以简单地获取枚举器出现的URL并删除URL的“私有”部分,以便字符串匹配,我可以继续,但我想了解为什么会发生这种情况。另请注意,这只会在您将应用程序放在iDevice上时发生,因为目录不同于使用iOS Simulator
进行模拟时。
感谢任何可以提供帮助的人。
答案 0 :(得分:1)
/ var是/ var / private的符号链接,使用[NSURL URLByResolvingSymlinksInPath]
来解析符号链接。
在你的例子中:
for(NSURL *url in enumerator) {
NSURL *resolvedSymlinksURL = [url URLByResolvingSymlinksInPath];
...
}
更详细的讨论:What does the /private prefix on an iOS file path indicate?
答案 1 :(得分:0)
for
循环中,查看url
对象是否包含某些返回字符(例如\r
或\n
)并在继续之前将其删除。