2011-03-06 100 views
0

我最近開始使用iPhone文件系統,起初我在理解某些概念時遇到了一些麻煩,但我認爲最終我讓它們變得直線流暢。將文件複製到文檔目錄導致失敗

我的問題是,我試圖複製從郵件應用程序文件(或打開我的應用程序與文件類型我的應用程序支持的任何應用程序)通過實施application:openURL:sourceApplication:annotation:方法文檔目錄(NSDocumentDirectory),但我的應用程序似乎在執行此操作時失敗。

我創建了一個BOOL與我的文件管理器在複製文件時返回的值([fileManager copyItenAtPath:filePath toPath:newFilePath error:&error];,其中newFilePath是我的文檔目錄),然後檢查它,然後NSLog如果失敗或成功,我總是失敗。

在試圖找出我的Documents目錄發生了什麼後,我啓用了文件共享,而不是看到我複製的文件,我得到一個收件箱文件夾,並將該文件夾複製到桌面後,我看到我的文件在那裏。這是爲什麼?我怎樣才能得到我想要的結果?

我在蘋果文檔的某個地方看到,當UIDocumentInteractionController打開一個文件時,它將它複製到收件箱文件夾,但顯然,我的應用程序不使用UIDocumentInteractionController

預先感謝您的幫助,非常感謝。


編輯從這裏開始

這裏是我的原代碼:

//AppDelegate.m 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication (NSString *)sourceApplication annotation:(id)annotation 
{ 
    rootFolder.fileURLFromLaunch = url; //Passing the URL on to aproperty on a different class 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ApplicationDidOpenFile" object:nil]; // notifying that the URL was passed and a file was opened 
    return YES; 
} 

這是做與文件中的所有工作類:

//RootFolder.m 

- (void)copyFileIntoApp 
{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsPath = [paths objectAtIndex:0]; 

    NSString *filePath = [fileURLFromLaunch path]; 

    NSString *displayName = [filePath lastPathComponent]; 

    NSError *error = NULL; 

    NSString *finalFilePath = [NSString stringWithFormat:@"%@/%@", documentsPath, displayName]; 

if ([fileManager fileExistsAtPath:finalFilePath]) { 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"File already exists!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [alert show]; 
    [alert release]; 

} else { 

    BOOL success = [fileManager copyItemAtPath:filePath toPath:finalFilePath error:&error]; 
    if (success) { 

     NSLog(@"success"); 
     Document *document = (Document *) [NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:managedObjectContext]; 

     [document setFilename:displayName]; 

     [document setPath:finalFilePath]; 

     if (![managedObjectContext save:&error]) { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please try again or restart the app" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 
      [alert release]; 
     } 

     [fileArray insertObject:document atIndex:0]; 

     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 

     [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
           withRowAnimation:UITableViewRowAnimationFade]; 
     [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

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


} 

}

我希望這使事情更清楚。

+0

失敗時會得到什麼錯誤信息? – Jim 2011-03-06 16:02:11

+0

沒什麼,我只是創建了一個'if ... else'循環,其中如果'BOOL'結果'YES',我會執行'NSLog(@「success」);'如果結果爲NO,我會執行'NSLog(@失敗「);' – ArturoVM 2011-03-06 16:17:29

+1

你能用'[error localalizedDescription]'記錄錯誤嗎? – FreeAsInBeer 2011-03-06 16:20:22

回答

1

我得到一個收件箱文件夾,並在該文件夾複製到桌面我看到我的文件都在那裏。這是爲什麼?我怎樣才能得到我想要的結果?

由於您的應用程序是沙盒式,並且無法訪問不在其自己的目錄中的文件。當用戶告訴iOS他想用特定應用程序打開文件時,iOS會將該文件複製到收件箱目錄中。


發佈完整代碼application:openURL:sourceApplication:annotation:
你的「我正在做這個和那個」並不是很有幫助,因爲這和那之間有一個缺陷。你用你的話說明的算法是正確的,但是在你的實現中顯然存在一個錯誤。

所以請發佈此方法的完整代碼。


編輯:我測試了你的代碼的相關部分,他們似乎工作。

我會檢查fileManager不是零。這可以解釋爲什麼你沒有看到錯誤信息。

+0

好吧,基於你剛纔所說的,我似乎從一個錯誤的角度來看待這個問題:我正在做的是試圖複製文件直接從它在郵件應用程序中的位置,但現在你告訴打開文件的應用程序會在其收件箱文件夾中獲得該文件的副本,我想我應該將該文件從收件箱文件夾移動到Documents目錄中,對嗎?無論哪種方式,我會發布我的代碼。我會盡力以不同的方式處理,併發布我的發現。 – ArturoVM 2011-03-07 03:35:40

+0

我可以在評論中張貼大量代碼,我會在OP中發佈。 – ArturoVM 2011-03-07 03:36:12

+1

@Arturo代碼在問題中更有用。我測試了你的代碼,它適用於我。但是我必須做一些改變才能使它工作,所以這些可以隱藏一些錯誤。例如,我不得不創建一個本地的NSFileManager實例,因此請檢查'fileManager'不是在你的代碼中。也許你忘了在某個地方啓動它。 – 2011-03-07 10:12:56

1

你是否在實例化時將你的錯誤設置爲null?如果您沒有指出NSError指向的內存不會爲NULL,並且您的邏輯將被觸發。

這樣做:

NSError *error = NULL; 

不是這個:

NSError *error; 
+0

我將它初始化爲零,我會用'NULL'嘗試一下,看看會發生什麼 – ArturoVM 2011-03-06 16:15:59

相關問題