2011-11-09 51 views
3

我想在我的一個NSBundle的文件夾包含相當數量的圖像的複製。
我試着用這些代碼。iPhone/iPad的:無法從一個NSBundle複製文件夾NSDocumentDirectory

NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:@"Images"]; 

    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] 
              stringByAppendingPathComponent:@"Images"]; 
     [fileManager copyItemAtPath:resourceDBFolderPath toPath:documentDBFolderPath error:&error]; 

比方說,有一個名爲Test.png的文件夾中的形象,我想在我的按鈕顯示的圖像,這是行不通的!
不過,如果我只是從一個NSBundle到NSDocumentDirectory複製一個單一的形象,它的作品!

例子:

更改

stringByAppendingPathComponent:@"Images" 

stringByAppendingPathComponent:@"Test.png" 

所以,問題在於該文件夾複製到NSDocumentDirectory!
我的代碼是否正確?
或者它不可能複製文件夾? (這意味着我必須單獨複製文件)

回答

5

奧斯卡是正確的,目前還沒有辦法用一個命令複製整個文件夾。

的方法,例如,這可能做的伎倆(預警 - 我的辦公室連接下來,我無法訪問我的Mac驗證此代碼工作將驗證這一次我能)。只需與[self copyDirectory:@「Images」]聯繫,它將處理剩下的事情。

-(void) copyDirectory:(NSString *)directory { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *documentDBFolderPath = [documentsDirectory stringByAppendingPathComponent:directory]; 
    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:directory]; 

    if (![fileManager fileExistsAtPath:documentDBFolderPath]) { 
     //Create Directory! 
     [fileManager createDirectoryAtPath:documentDBFolderPath withIntermediateDirectories:NO attributes:nil error:&error]; 
    } else { 
     NSLog(@"Directory exists! %@", documentDBFolderPath); 
    } 

    NSArray *fileList = [fileManager contentsOfDirectoryAtPath:resourceDBFolderPath error:&error]; 
    for (NSString *s in fileList) { 
     NSString *newFilePath = [documentDBFolderPath stringByAppendingPathComponent:s]; 
     NSString *oldFilePath = [resourceDBFolderPath stringByAppendingPathComponent:s]; 
     if (![fileManager fileExistsAtPath:newFilePath]) { 
      //File does not exist, copy it 
      [fileManager copyItemAtPath:oldFilePath toPath:newFilePath error:&error]; 
     } else { 
      NSLog(@"File exists: %@", newFilePath); 
     } 
    } 
} 

- 編輯11/9/2011 - 對此深感抱歉,因爲我事先警告我不能訪問我的Mac驗證碼。 更新了代碼,我已驗證它現在可以正常工作。添加了幾個快速的NSLog來告訴你新的目錄或新文件是否已經存在。

+0

它說directoryContentsAtPath已被棄用 – Lloydworth

+0

它不工作我試圖從NSDocumentDirectory檢索圖像並顯示它一個ImageView的,但它不工作 – Lloydworth

+0

@Lloydworth - 。!爲你更新的代碼和它在iOS 5.0正常工作讓我知道,如果您有任何疑問或需要幫助它 – Geekswordsman

0

恐怕目前沒有辦法複製文件夾,並且如果有第三方功能執行此操作,它所做的只是按文件複製文件。因此你必須單獨複製每個文件。

+0

哦不...這意味着,如果我有50頁要複製的文件,我需要編寫代碼來複制他們的50? :( – Lloydworth

+0

恐怕是這樣,它看起來像是它的geekswordsman的代碼或文件名數組的foreachloop – CodaFi

6

下面的代碼將創建一個名爲「圖片」文件夾中的文件目錄下,並從一個名爲「folderinbundle」文件夾中捆綁的所有文件拷貝到「圖片」

- (void) copyImages 
{ 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"folderinbundle"]; //folder contain images in your bundle 
    NSString *destPath = [documentsDirectory stringByAppendingPathComponent:@"images"]; //images is your folder under document directory 

    NSError *error; 
    [[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destPath error:&error]; //copy every files from sourcePath to destPath 
} 

編輯澄清:上面會如果「folderinbundle」是不是組的物理文件夾,則工作。

+0

@。 bandejapaisa:看我的編輯 – user523234

+0

我已經刪除了我以前的評論關於這個不工作。 – bandejapaisa

相關問題