NSFileManager:enumeratorAtURL:向NSFileManager返回一个不同forms的URL:URLForDirectory
如果我使用NSFileManager:URLForDirectory
获取我的沙箱的Application Support目录,那么我找回以下URL:
file://localhost/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/
但是,如果我使用NSFileManager:enumeratorAtURL
来search目录,我找回了表单的URL:
file://localhost/private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application%20Support/
这是我造成的问题,因为我正在做urlsearch/replace操作和差异导致不匹配。 我在之前的其他地方遇到过这种差异,然后我的解决scheme是使用URL(使用NSURL:path
)而不是原始URL的path,但是在这种情况下不会生效,因为path是:
/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support /private/var/mobile/Applications/EA80DE91-394C-4EAB-B269-1081C859BB0F/Library/Application Support/
我想要做的是这样的:我可以在我的应用程序支持目录中具有相同的名称,但位置不同的任何数量的文件,我需要提取相对于应用程序支持目录的path。 即如果我有以下
/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:
返回相同的path,但由于它们在硬件上的差异而失败。
有没有办法让enumeratorAtURL:
和URLForDirectory:
返回相同的path,或者如果不是有一种替代的优雅的方式提取子path到我目前正在做的?
var
被链接到/private/var/
调用[url URLByResolvingSymlinksInPath]
修复它。
请参阅iOS文件path上的/ private前缀表示什么? 进行更多的讨论。
我不得不切换到这样做:
NSDirectoryEnumerator *dirEnum = [self.fileManager enumeratorAtPath: [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Application Support/"]];