我最近開始使用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]);
}
}
}
我希望這使事情更清楚。
失敗時會得到什麼錯誤信息? – Jim 2011-03-06 16:02:11
沒什麼,我只是創建了一個'if ... else'循環,其中如果'BOOL'結果'YES',我會執行'NSLog(@「success」);'如果結果爲NO,我會執行'NSLog(@失敗「);' – ArturoVM 2011-03-06 16:17:29
你能用'[error localalizedDescription]'記錄錯誤嗎? – FreeAsInBeer 2011-03-06 16:20:22