的NSFileManager:enumeratorAtURL:返回一个不同形式的URL的NSFile

2019-06-26 09:09发布

如果我取用我的沙箱的应用支持目录NSFileManager:URLForDirectory然后我得到以下网址:

file://localhost/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/

但是,如果我使用NSFileManager:enumeratorAtURL搜索我找回形式的URL目录:

file://localhost/private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/

这是导致我的问题,因为我在做URL查找/替换操作和差异导致的不匹配。 我碰到的这种差异的其它地方之前,然后我的解决方案是(通过使用URL的路径NSURL:path )而不是原始网址,但这不会在这种情况下,作为工作产生的路径是:

/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support
/private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support/

我所试图做的是这样的:我可以在使用相同的名称,但不同的位置我的应用程序支持目录中的任何数量的文件,我需要相对于应用程序支持目录的路径提取。 也就是说,如果我有以下

/Application Support/abc/file.dat
/ApplicationSupport/abc/def/file.dat

我希望能够提取“ABC”和“ABC / DEF”。 我在做这个使用下面的代码:

NSArray *keys = [NSArray arrayWithObject:NSURLIsRegularFileKey];
NSDirectoryEnumerator *dirEnumerator = [self.fileManager enumeratorAtURL:[MyManager appSupportDirectory]
                                          includingPropertiesForKeys:keys
                                                             options:NSDirectoryEnumerationSkipsHiddenFiles
                                                        errorHandler:nil];
    for (NSURL *url in dirEnumerator)
    {
        if ( NSOrderedSame == [[url lastPathComponent] caseInsensitiveCompare:kFilename])
        {
            NSString *appSupportPath = [[MyManager appSupportDirectory] path];
            NSString *pathToFile = [url path];
            pathToFile = [pathToFile URLByDeletingLastPathComponent];
            NSString *subPath = [pathToFile  stringByReplacingOccurrencesOfString:appSupportPath withString:@""];

(MyManager:appSupportDirectory调用的NSFileManager:URLForDirectory:使用NSApplicationSupportDirectory)

这工作正常,在模拟器, enumeratorAtURL:URLFOrDirectory:返回相同的路径,但由于其对硬件差异失败。

有没有办法让enumeratorAtURL:URLForDirectory:返回相同的路径,或者如果不是在那里提取的子路径,以我目前做的另一种优雅的方式?

Answer 1:

var被链接到/private/var/

调用[url URLByResolvingSymlinksInPath]修复它。

看什么的/私有前缀的iOS的文件路径说明什么? 更多的讨论。



Answer 2:

我不得不切换到这样做,而不是:

NSDirectoryEnumerator *dirEnum = [self.fileManager enumeratorAtPath: [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]];


文章来源: NSFileManager:enumeratorAtURL: returns a different form of URL to NSFileManager:URLForDirectory