2009-12-23 88 views
0

简短版本:我想我很快就要求一个文件,但它假装已经准备好了。我错过了什么吗?文件是否可以打开?

略长版本:我正在将文件写入磁盘。在我这样做之前,我让用户添加一些元数据,包括新的文件名。一旦用户完成,屏幕消失,程序将文件写入磁盘。用户可以查看文件列表。该列表是通过读取文件夹的内容生成的。新文件位于文件列表中,但当我尝试从要显示的文件中提取信息(例如文件大小)时,程序崩溃。尽我所知,发生崩溃的原因是,当文件名称存在时,它不可读取。 (顺便说一下,这些都是小文件 - 几百K)。

首先,是否有可能文件出现在目录中,但还没有全部出现? a 第二,如果是这样,我该如何检查文件是否准备好被读取?

非常感谢。

UPDATE:

感谢。我会尝试添加更多信息。我正在用AVAudioRecorder录制音频文件。初始行是:

soundrecording = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error]; 

该程序经历了它的UI更新和计量等等。当音频停止,我呼吁:

[soundrecording stop]; 

,当一切被更新,并准备继续前进,我呼吁:

[soundrecording release]; 
soundrecording=NULL; 

据我了解,这应该释放的护理该文件,是吗?

再次感谢。

+0

这与Objective-C有什么关系?你没有告诉我们你有什么样的崩溃,以及你如何获得文件的大小。如果你需要一些帮助,你必须告诉我们更多的不只是你的假设。 – dreamlax 2009-12-23 04:01:24

+1

这个问题及其答案可能对每个人都更有用,如果您希望发布一段代码样本,并指出发生错误的位置。 – 2009-12-23 04:06:24

+0

谢谢。我在上面添加了更多信息。 – 2009-12-23 04:20:49

回答

0

既然你已经添加了示例代码,我可以说更多。

首先,class reference好像在说stop方法会关闭文件。但是它似乎也表明有一个潜在的音频会话正在进行,可能还有一些转换。我想我记得iPhone的Voice Notes应用程序可能使用这个API,它必须做一些工作来压缩长记录完成后。

所以我支持你的预感。我认为你的文件可能还没有关闭,但在另一个正在处理记录的数据的线程上保存了适当的格式。

您可能想要设置一个NSTimer以尝试每秒钟左右打开文件,以便您的用户界面在完成时可以振作起来。在此期间,您可能希望显示“请稍候”类别的消息,或者让用户知道它正在工作。

+0

谢谢。它看起来像文件没有被释放。在AVAudioRecorder停止并释放并且用户调用菜单后,我有: \t NSString * filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@“wav”inDirectory:@“../ Documents”] ; ([“NSFileManager defaultManager] isReadableFileAtPath:filePath] == NO){ \t while([[NSFileManager defaultManager] isReadableFileAtPath:filePath] == NO){ \t NSLog(@”ready?“); \t \t [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; \t} 它只是坐在那里打印出“准备好?”永远。 任何想法如何我可以追踪到什么坚持音频文件? 再次感谢。 – 2009-12-23 05:20:32

+0

也许它永远不会被写入,因为你意外地在沙箱外面。尝试以规范的方式获取文档文件夹: NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString * documentsDirectory = [paths objectAtIndex:0]; – 2009-12-23 05:32:58

+0

谢谢。我知道文件正在写入,因为在崩溃之后,我重新打开了应用程序,并且文件在那里。同时,我注意到只有在我录制文件之前打开列表,新文件才会导致挂起。 (即打开列表视图(通常是删除前一个文件),关闭列表视图,打开记录视图,记录文件,关闭记录视图,并再次打开列表视图,此时它会挂起。)我想这意味着问题是我如何重新使用列表视图。我每次关闭并重新打开每个列表,因此我不确定结果是什么。不管怎样,谢谢。 – 2009-12-23 06:01:00

1

我会做的第一件事是确认你说的文件尚未准备好。要做到这一点,在写作之后和阅读之前将程序休息一两秒钟。几百KB不应该花费比准备好的时间更长的时间。

如果它仍然失败,我的猜测是你没有关闭你用来写它的文件句柄。它可能没有准备好阅读,因为文件系统认为你可能会继续写。

通常,检查文件是否准备就绪的方法是尝试打开文件。如果成功,你可以阅读它。或者如果失败并出现错误,则可以优雅地处理错误:

  • 在命令行实用程序中,您可能会打印错误并退出,并且用户可以再次尝试。
  • 如果它是一个不应退出的后台程序,就像服务器一样,您可以记录该错误。您可能还会在延迟后自动重试。如果这是一个很大的错误,你可能希望让程序通过电子邮件告诉你。
  • 在GUI窗口应用程序中,您可能想要显示错误对话框或面板,然后为用户提供重试机会。
+0

这将是我的猜测。读取访问被拒绝,因为它仍然可以写入。 – 2009-12-23 04:04:27

+0

我已经在上面添加了更多具体信息。 – 2009-12-23 04:21:33

相关问题