NSSearchPathForDirectoriesInDomains возвращает неверный каталог

Я использую NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) для получения каталога документов приложения в моем приложении, но возвращаемый массив содержит только один объект, и это недопустимый для записи неправильный каталог:

/ Пользователи / я / Библиотека / Поддержка приложений / Симулятор iPhone / Документы

Я нашел этот вопрос, который указывает на то, что проблема связана с подготовкой, но в ответе говорится немного больше, чем это. Думаю, я задаю повторяющийся вопрос, но ответа на этот вопрос недостаточно, поэтому я надеюсь получить в нем реальный ответ.


person Josh Brown    schedule 29.06.2011    source источник
comment
Ответ на этот вопрос действительно ужасно неудовлетворительный. Когда вы найдете здесь решение, отметьте мод, чтобы он объединял / закрывал другой.   -  person jscs    schedule 29.06.2011
comment
Консоль вообще показывает ошибки?   -  person Oscar Gomez    schedule 05.07.2011
comment
Некоторые другие ответы / комментарии, похоже, указывают на то, что эта функция может фактически возвращать массив с более чем одним каталогом. Вы можете проверить и увидеть, так ли это?   -  person jtbandes    schedule 05.07.2011
comment
@jtbandes Спасибо, что указали на это. Обновил вопрос с уточнением - получаю только один каталог.   -  person Josh Brown    schedule 05.07.2011
comment
@OscarMk Я вижу ошибку в консоли, но это связано с тем, что я пытаюсь записать файл .sqlite в каталог, указанный в вопросе, который нельзя записать.   -  person Josh Brown    schedule 05.07.2011
comment
@ Джош Браун, не могли бы вы опубликовать эту ошибку, пожалуйста.   -  person Oscar Gomez    schedule 05.07.2011
comment
@OscarMk Эта ошибка является прямым результатом проблемы, описанной в вопросе. Похоже на ненужную информацию, не так ли?   -  person Josh Brown    schedule 05.07.2011
comment
Хм ... так что одна из причин, по которой возвращаемый каталог может отличаться от того, что вы ожидаете от приложения, может быть связана с целевым типом Xcode. Это ведь не цель тестирования, не так ли? В этом случае правильным ответом может быть ответ без GUID приложения, поскольку на самом деле это не приложение. Это обсуждение в группе Google подразумевает, что в этом случае вам достаточно просто создать каталог: groups.google.com/group/google-toolbox-for-mac/browse_thread/   -  person Rob    schedule 05.07.2011
comment
Просто для усмешки я создал каталог / Users / me / Library / Application Support / iPhone Simulator / Documents из окна терминала, и теперь он запускается. Ошибки тестирования все еще есть, но они могут быть настоящими.   -  person Rob    schedule 05.07.2011
comment
Роб - ты прав. Проблема, должно быть, заключалась в том, что это была цель тестирования.   -  person Josh Brown    schedule 06.07.2011


Ответы (4)


Хм ... так что одна из причин, по которой возвращаемый каталог может отличаться от того, что вы ожидаете от приложения, может быть связана с целевым типом Xcode. Это ведь не цель тестирования, не так ли? В этом случае правильным ответом может быть ответ без GUID приложения, поскольку на самом деле это не приложение. Это обсуждение в группе Google подразумевает, что в этом случае все будет хорошо просто создав каталог.

Просто для усмешки я создал каталог / Users / me / Library / Application Support / iPhone Simulator / Documents из окна терминала, и теперь он запускается. Ошибки тестирования все еще есть, но они могут быть настоящими.

Я бы порекомендовал вам изменить тестовое приложение, чтобы создать каталог документов, если он отсутствует - что-то вроде:

  if(![[NSFileManager defaultManager] createDirectoryAtPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) withIntermediateDirectories:YES attributes:nil error:NULL])
        NSLog(@"Error: Create folder failed %@", NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES));
person Rob    schedule 06.07.2011

Это работает для меня:

[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                        inDomains:NSUserDomainMask] lastObject];
person vocaro    schedule 29.06.2011
comment
Спасибо за ответ. К сожалению, URLsForDirectory: inDomains: доступен только в iOS 4.0 и выше, и я поддерживаю 3.1.3. Есть ли другой способ найти этот каталог, доступный до 4.0? - person Josh Brown; 29.06.2011
comment
У меня нет ответа, но почему вы все еще поддерживаете 3.x? Нет смысла терять производительность для ‹5% пользователей. - person vocaro; 29.06.2011
comment
Я пробовал этот подход, но у меня была такая же проблема. Это дает мне точно такой же каталог, что и NSSearchPathForDirectoriesInDomains. - person Josh Brown; 30.06.2011

Вы можете попробовать это:

 /**
 Returns the path to the application's Documents directory.
 */
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

Я считаю, что вам не хватает только сообщения lastObject.

person Oscar Gomez    schedule 05.07.2011
comment
Спасибо. Фактически, это то, что я делаю - NSString, возвращаемый lastObject, является неправильным путем, указанным в вопросе. - person Josh Brown; 05.07.2011
comment
@Josh Brown Возвращает ли сообщение более 1 элемента в массиве? Пробовали ли вы писать по любому из возвращаемых путей? - person Oscar Gomez; 05.07.2011
comment
@Josh Brown проблема также может быть связана с msg stringByAppendingPathComponent: если вы не передаете ему действительное имя файла. - person Oscar Gomez; 05.07.2011

У меня точно такая же проблема, и в моем случае это потому, что я запускаю код из класса XCTest.

Я предполагаю, что тесты не запускаются в изолированной программной среде приложения.

Это потому, что мои тесты относятся к проекту статической библиотеки, включенному в основной проект.

Как только я запускаю тот же самый код из запуска моего приложения, пути возвращаются правильно.

Надеюсь это поможет.

person Axy    schedule 28.01.2014