2011-11-08 87 views
1

我想將多個文件從我的一個NSBundle複製到文檔目錄應用程序啓動時。多個文件複製到文檔目錄

這是複製文件的代碼:

- (NSString *) getPath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingString:@"Photo.png"]; 
} 

- (void) copyFile 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *Path = [self getPath]; 
    BOOL success = [fileManager fileExistsAtPath:Path]; 

    if(!success) { 

    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photo.png"]; 
    success = [fileManager copyItemAtPath:defaultPath toPath:Path error:&error]; 

    if (!success) 
     NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]); 
    } 
} 

的的CopyFile方法將被稱爲在「applicationDidFinishLaunchingWithOptions」方法。但是這種方法只允許將一個文件複製到Documents目錄。如果我想從我的NSBundle複製50個文件,這是否意味着我必須指定50個路徑?有沒有簡短的方法,例如只用幾行代碼就可以獲得NSBundle中的所有文件?

回答

0

改變你的函數的原型:

- (NSString *) getPathofFileName:(NSString*)name; 
- (void) copyFileWithName:(NSString*)name; 
+0

可我知道爲什麼嗎? – Lloydworth

+0

@Lloydworth因爲這樣你可以調用'copyFileWithName' 50次,每次給另外一個文件名和'copyFileWithName'可以調用'getPathOfFileName'每一個不同的文件名的時間來獲取複製的當前文件的路徑。當然這仍然意味着你需要所有這50個文件的列表。所以這不是一個方便的解決方案。 – Mecki

0

耶相信你能做到這一點

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 

    NSMutableArray *filesArray = [NSMutableArray arrayWithObjects:@"0.epub",@"1.epub",@"2.epub",@"3.epub",@"4.epub",nil];//here put the name of files you want to copy 
    [self copyFilesToDocuments:filesArray]; 

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque; 
    self.window.rootViewController = (UIViewController*)self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

- (void) copyFilesToDocuments : (NSMutableArray*)filesArr { 
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES) lastObject]; 

    for(int i = 0 ; i < [filesArr count] ; i++) { 
     NSString *filePath = [docDir stringByAppendingPathComponent:[filesArr objectAtIndex:i]]; 
     NSFileManager *fm = [NSFileManager defaultManager]; 
     BOOL exist = [fm fileExistsAtPath:filePath]; 
     NSError *error = nil; 

     if (!exist) { 
      NSString *path = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:[filesArr objectAtIndex:i]]; 
      BOOL success = [fm copyItemAtPath:path toPath:filePath error:&error]; 
      if (!success) { 
       NSAssert1(0,@"%@",[error localizedDescription]); 
      } 
     } 
    } 
} 
6

您可以從您的資源文件夾中的所有文件複製,但我懷疑你真的想這樣做,你做?畢竟這些也是應用程序資源(如字符串文件或圖形只適用於用戶界面按鈕等)

所以你可能想要在你的資源文件夾中有一個子目錄(例如命名爲FilesToCopy)與你所有的文件要複製(如Photo.pngContents/Resources/FilesToCopy/Photo.png找到)

爲了獲得一個目錄的內容,只需使用

NSError * err; 
NSArray * files; 
NSString * srcPath; 
NSString * dstPath; 
NSFileManager * man; 

srcPath = [self getSrcPath]; 
dstPath = [self getDstPath]; 
man = [[NSFileManager alloc] init]; 
files = [man contentsOfDirectoryAtPath:srcPath error:&err]; 

然後你就可以一次複製一個文件:

for (NSString *aFile in files) { 
    BOOL success; 

    NSString * srcFile = [srcPath stringByAppendingPathComponent:aFile]; 
    NSString * dstFile = [dstPath stringByAppendingPathComponent:aFile]; 
    success = [man copyItemAtPath:srcFile toPath:dstFile error:&err]; 
    // Verify success 
} 

現在你只需要srcPathdstPath

- (NSString *)getSrcPath 
{ 
    return [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"FilesToCopy"]; 
} 

- (NSString *)getDstPath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    return [paths objectAtIndex:0]; 
} 
+0

這實際上是問題的正確答案。謝謝Mecki。要記住 – Bms270

+0

一個重要的事情就是選擇拖動到項目時,從該對話框中的「創建文件夾引用」。如果您只是創建一個組,代碼將無法找到該文件夾​​,因爲它是一個組,因此它不會枚舉這些文件,也不會進行復制。 –

相關問題