问题 NSFileManager:enumeratorAtURL:向NSFileManager返回不同形式的URL:URLForDirectory


如果我使用获取沙盒的Application Support目录 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)而不是原始URL,但是在这种情况下,由于生成的路径是:

/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目录中可以有相同名称但位置不同的任意数量的文件,我需要提取相对于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: 返回相同的路径,或者如果没有,是否有另一种优雅的方法来提取子路径到我目前正在做的事情?


5596
2017-07-18 17:26


起源



答案:


var 符号链接到 /private/var/

调用 [url URLByResolvingSymlinksInPath] 解决它。

看到 iOS文件路径上的/ private前缀表示什么? 进一步讨论。


7
2018-04-16 00:11





我不得不改用这样做:

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

3
2017-07-18 19:07



我有同样的问题。 fileManager的contentsOfDirectoryAtURL返回带有/ private /的URL。我在数据库中的URL记录比较时遇到了麻烦。 - John


答案:


var 符号链接到 /private/var/

调用 [url URLByResolvingSymlinksInPath] 解决它。

看到 iOS文件路径上的/ private前缀表示什么? 进一步讨论。


7
2018-04-16 00:11





我不得不改用这样做:

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

3
2017-07-18 19:07



我有同样的问题。 fileManager的contentsOfDirectoryAtURL返回带有/ private /的URL。我在数据库中的URL记录比较时遇到了麻烦。 - John