2013-08-30 4 views
1

Я хочу проверить один файл в папке «Документ». Я хочу, чтобы этот файл не существовал в папке документа, скопировав его из основного пакета в папку документа. Я пишу этот код и этот файл, чтобы копировать, но моя проблема здесь ..... !!!! мой файл .sqlite файл (файл базы данных), а когда копировать в папку документа нет данных в себе !!!! Зачем??? в то время как этот файл, когда находится в основном пакете, имеет данные в себе.Как скопировать файл из основного пакета в папку документа

это мой код, но я не знаю, почему бы не работать !!!!

#define DataName @"mydatabase.sqlite" 


- (void)viewDidLoad 
{ 
    [self CopyDatabase]; 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (NSString*)DatabasePath 
{ 
    NSArray *Paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *DocumentDir = [Paths objectAtIndex:0]; 
    //NSLog(@"%@",DocumentDir); 
    return [DocumentDir stringByAppendingPathComponent:DataName]; 

} 

- (void)CopyDatabase 
{ 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    success = [fileManager fileExistsAtPath:[self DatabasePath]]; 
    NSString *FileDB = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:DataName]; 
    if (success) 
    { 
     NSLog(@"File Exist"); 
     return; 
    } 
    else 
    { 
     [fileManager copyItemAtPath:FileDB toPath:[self DatabasePath] error:nil]; 
    } 

} 
+1

Показать определение 'DataName'. Также запишите полученную строку 'FileDB', используя' NSLog() '. Также не пропускайте 'error: nil'; используйте этот механизм, чтобы получить лучшую отчетность об ошибках ... это стоит 2 минуты усилий. – trojanfoe

+0

1. Вы должны начинать имена методов строчными буквами. 2. Если вы передаете указатель на не-объект, не используйте 'nil', вместо этого используйте' NULL'. –

+0

Возможно, он скопировал старый файл, который у вас был ранее в вашем пакете, или он, возможно, сохранил более старую копию в папке ваших документов и не заменяет ее. Возможно, вам придется очистить папку документов до копирования. – ApolloSoftware

ответ

3

Я не думаю, что папка ваших документов обновляется, потому что существует более старая версия этого db. Вы можете очистить свой каталог документов с помощью следующего метода, и добавить его в верхней части viewDidLoad:

- (void)viewDidLoad 
{ 
    [self purgeDocumentsDirectory]; 
    [self CopyDatabase]; 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void)purgeDocumentsDirectory 
{ 
    NSLog(@"Purging Documents Directory..."); 
    NSString *folderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSError *error = nil; 
    for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error]) { 
     [[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:file] error:&error]; 
    } 
} 
+0

Если это правда, тогда не будет 'NSLog (@" File Exist ");' fire? – trojanfoe

+1

Почему вы хотите очищать все файлы в папке 'Documents' каждый раз, когда это представление загружается? – rmaddy

+0

У меня был ТОЧНЫЙ тот же вопрос выше со старой копией sqlite.DB. Симптомы звучали знакомо, поэтому чистка была тем, что требовалось. Это не обязательно нужно загружать каждый раз, когда представление загружается, а если вы делаете какую-то простую логику, например, сравниваете отметки времени или размеры двух баз данных, вы можете копировать новую копию на основе этого результата вместо каждого раза, так как необходимо. Папки «Документы» печально известны тем, что оставляют за собой беспорядок. – ApolloSoftware

0

Это мое решение

-(void) copytoDocument { 
    NSString *openFile ; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

     NSString *pgnPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.text", @"100_Greatest_games"]]; 

     if ([fileManager fileExistsAtPath:pgnPath] == NO) 
     { 
      NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"100_Greatest_games" ofType:@"text"]; 
      [fileManager copyItemAtPath:resourcePath toPath:pgnPath error:&error]; 
      if (error) { 
       NSLog(@"Error on copying file: %@\nfrom path: %@\ntoPath: %@", error, resourcePath, pgnPath); 
      } 
    } 
    } 
Смежные вопросы