我正在尝试使用以下代码从路径中删除文件。但是我的应用程序在从路径中删除文件时崩溃。
- (void)saveEditedSavedFile:(NSString*)editedfile As:(NSString*)originalFile
{
[originalFile retain];
NSArray* dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* docsDir = [dirPaths objectAtIndex:0];
NSError* error = nil;
NSString *editedFilePath=[docsDir stringByAppendingPathComponent:editedfile];
NSFileManager* fileMngr = [NSFileManager defaultManager];
if([fileMngr fileExistsAtPath:originalFile])
{
nslog(@"%@", originalFile); // nslog always prints the correct path even if it crashes..
[fileMngr removeItemAtPath:originalFile error:NULL];
}
if ([fileMngr moveItemAtPath:editedFilePath toPath:originalFile error:&error] != YES)
{
UIAlertView* alertView1 = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Unable to Save File. Please Choose a Diffrent name." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alertView1 show];
[alertView1 release];
}
}
这里我试图用新文件替换已经存在的文件。(移动文件操作)但它在[fileMngr removeItemAtPath:originalFile error:NULL]崩溃;
我正在收到这样的调用堆栈。
#0 0x99f1dc5a in __kill ()
#1 0x99f1dc4c in kill$UNIX2003 ()
#2 0x99fb05a5 in raise ()
#3 0x99fc66e4 in abort ()
#4 0x99fb4e78 in szone_error ()
#5 0x99fb4fb3 in free_list_checksum_botch ()
#6 0x99ec7a88 in small_free_list_remove_ptr ()
#7 0x99ec45cc in szone_free_definite_size ()
#8 0x99ec35e8 in free ()
#9 0x99ee8adb in fts_close$INODE64 ()
#10 0x99f31b57 in __removefile_tree_walker ()
#11 0x99f31999 in removefile ()
#12 0x0006ed01 in -[NSFilesystemItemRemoveOperation main] ()
#13 0x0005cbd2 in -[__NSOperationInternal start] ()
#14 0x0006eaa2 in -[NSFileManager removeItemAtPath:error:] ()
任何人都可以告诉我为什么我的应用程序崩溃了吗?我检查那条道路是否正确。
答案 0 :(得分:1)
最好的猜测是originalFile
已经过度释放,并且在执行-removeItemAtPath:error:
期间的某个时刻,其内存已被重新分配。尝试使用僵尸分析工具运行它。
答案 1 :(得分:0)
堆栈跟踪看起来NSFileManager
中存在实现错误。
执行删除(嵌套)文件(remove file
和__removefile_tree_walker
)的脏工作的函数使用BSD的“fts”工具(请参阅man fts
)来遍历目录结构。在后一个函数中,FTS
句柄被关闭但未打开。这绝对是实现中的一个错误。你应该file a radar。
如何发生这是一个猜测的问题。我将查看文件系统上的并发操作的方向(在同一项上并行删除,在删除时移动部分层次结构,...)。