Подтвердить что ты не робот

NSFileManager: enumeratorAtURL: возвращает другую форму URL-адреса NSFileManager: URLForDirectory

Если я извлечу файл поддержки приложений Sandbox с помощью NSFileManager:URLForDirectory, я вернусь к следующему URL-адресу:

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/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: для возврата идентичных путей, или если нет альтернативного элегантного способа извлечения подпутей к тому, что я сейчас делаю?

4b9b3361

Ответ 1

Мне пришлось переключиться на это:

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