调用URLForDirectory时,NSFileManager不提供正确的URL:inDomains:

时间:2014-01-15 15:22:11

标签: url ios7 nsfilemanager directory

我想首先说这个代码块在实现之前工作并推出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对象是在没有路径组件的情况下创建的(路径组件是私有/ ...)。为什么?更奇怪的是,我将数据保存到使用

创建的URL
[[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/Cac‌​hes/Experimental%20Post.cnt  

当我创建用于搜索的网址时:

file:///var/mobile/Applications/C63B378E-5EBE-417C-A465-8C3A3DCE013A/Library/Cac‌​hes/Experimental%20Post.cnt  

调查员看到了什么:

file:///private/var/mobile/Applications/C63B378E-5EBE-417C-A465-8C3A3DCE013A/Lib‌​rary/Caches/Experimental%20Post.cnt

我可以简单地获取枚举器出现的URL并删除URL的“私有”部分,以便字符串匹配,我可以继续,但我想了解为什么会发生这种情况。另请注意,这只会在您将应用程序放在iDevice上时发生,因为目录不同于使用iOS Simulator进行模拟时。

感谢任何可以提供帮助的人。

2 个答案:

答案 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)并在继续之前将其删除。