2010-05-15 2 views
4

Мне нужно скопировать несколько файлов примеров из папки ресурсов моего приложения и поместить их в папку документов моего приложения. Я придумал прилагаемый код, он компилируется отлично, но он не работает. Все каталоги, на которые я ссылаюсь, существуют. Я не совсем уверен, что я делаю неправильно, может кто-нибудь указать мне в правильном направлении, пожалуйста?NSFileManager - Копирование файлов при запуске

NSFileManager*manager = [NSFileManager defaultManager]; 

NSString*dirToCopyTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 

NSString*path = [[NSBundle mainBundle] resourcePath]; 

NSString*dirToCopyFrom = [path stringByAppendingPathComponent:@"Samples"]; 


NSError*error; 

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil]; 

for (NSString *file in files) 
{ 
     [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error]; 

     if (error) 
     { 
      NSLog(@"%@",[error localizedDescription]); 
    } 
} 

EDIT: Я только что отредактировал код так, как он должен быть. Однако теперь есть еще одна проблема:

2010-05-15 13:31:31.787 WriteIt Mobile[4587:207] DAMutableDictionary.h 2010-05-15 13:31:31.795 WriteIt Mobile[4587:207] FileManager Error:Operation could not be completed. File exists

EDIT: Я установил вопрос, говоря NSFileManager имена адресатов скопированных файлов-х годов.

 [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:[dirToCopyTo stringByAppendingPathComponent:file] error:&error]; 
+0

Не подавлять ошибки ('contentOfDirectoryAtPath: error:'). Кроме того, для 'copyItemAtPath: toPath: error:', проверьте, не сработал ли метод, прежде чем пытаться использовать объект ошибки; см. http://rentzsch.tumblr.com/post/260201639/nserror-is-hard. –

ответ

5

Я думаю, что проблема в этой строке:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyTo error:nil]; 

Вы перечисляете файлы в каталоге назначения вместо источника. Измените это на что-то вроде:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil]; 

И все должно быть в порядке.

+0

спасибо! это действительно проблема. теперь я ударил еще один, хотя это мой вывод журнала: 2010-05-15 13: 31: 31.787 WriteIt Mobile [4587: 207] DAMutableDictionary.h 2010-05-15 13: 31: 31.795 WriteIt Mobile [4587: 207] Ошибка FileManager: операция не может быть выполнена. Файл существует 2010-05-15 13: 31: 31.795 WriteIt Mobile [4587: 207] DAMutableDictionary.m 2010-05-15 13: 31: 31.802 WriteIt Mobile [4587: 207] Ошибка FileManager: операция не может быть выполнена. Файл существует и т. Д. И т. Д. Что это значит? – Pripyat

+0

Кажется, вы пытаетесь перезаписать файл. Перед копированием - убедитесь, что он не существует. – Eimantas

+0

, но папка «Документы» пуста? вот почему я удивлен? – Pripyat

2

Я думаю, что проблема в том, что лет читают файлы для копирования из dirToCopyTo, и я думаю, что вы имели в виду dirToCopyFrom

Кроме того, чтобы получить каталог документов вы должны использовать NSDocumentDirectory с - (NSArray *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask

+0

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

+0

В неанглийской версии OSX есть каталог всегда Documents? – Mark

+0

yes marc, мой iPhone установлен на немецкий язык, а все директории документов по-прежнему называются «Документы». – Pripyat

1
[manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error]; 

путь назначения - это путь, который вы хотите получить, включая его имя файла. Вы не можете передать путь к каталогу, ожидая, что NSFileManager заполнит имя исходного файла; это не будет сделано.

The documentation говорит, что путь назначения не должен ничего, что существует описать:

… dstPath must not exist prior to the operation.

В вашем случае, это путь к папке назначения, так что делает существует, поэтому копия не удается.

Вам необходимо сделать путь к месту назначения файл, добавив к нему желаемое имя файла. Тогда он не будет существовать (если ранее не скопирован), поэтому копия будет успешной.

2

Пожалуйста, обратите внимание, что длительной операции при запуске следует избегать:

  1. Не хороший опыт пользователя (задержка и круглоголовое поведение)
  2. Watchdog в прошивке могут убить ваше приложение, как если бы он застрял.

Так что сделайте копию во вторичном потоке (или операции ... или где-то другой путь выполнения).

Другая проблема возникнет, если Вы нужны данные, чтобы заполнить ваш пользовательский интерфейс: в этом случае:

  • Отключить элементы пользовательского интерфейса
  • начать асинхронной/резьбовой операции
  • В завершение обратного вызова копирования (через уведомление, протокол .. или другие средства) уведомлять об интерфейсе пользовательского интерфейса, он может начать выборку данных.

Например, мы копируем ZIP-файл и распаковываем его, но требуется некоторое время, поэтому нам пришлось поместить его в процедуру таймера, которая будет запускать пользовательский интерфейс, когда это будет сделано.

Если вам нужен пример, сообщите мне, знаю.

PS:
Копирование с использованием ZIP-файл является более эффективным, как:

  1. Вызывайте к файловой системе
  2. гораздо меньше байт скопировать

Плохая новость: вы должны использовать процедура делает распаковку zip-файла, но вы можете найти их в Интернете.

Декомпрессию Почтовые файлы должны быть более эффективными, поскольку эти вызовы записываются в прямом C, а не в какао со всеми накладными расходами.

+0

Да, спасибо. Этот вопрос уже более года и был решен. Я знаю это сам;) – Pripyat

+1

ok, david, я пропустил дату! надеюсь, это может помочь другим новичкам – ingconti

Смежные вопросы