是否可以打开文件?

时间:2009-12-23 03:52:31

标签: objective-c file audio avaudiorecorder

简短版本:我想我太快要求提供一个文件了,但它假装已经准备好了。我错过了什么吗?

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

首先,文件是否可能出现在目录中,但还不是全部? 一个 第二,如果是这样,我如何检查文件是否可以读取?

非常感谢。

更新

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

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

该程序通过它的UI更新和计量以及所有这些。当音频停止时,我打电话给:

[soundrecording stop];

当其他所有内容都更新并准备好继续前进时,我打电话给:

[soundrecording release];
soundrecording=NULL;

据我了解,这应该照顾发布文件,是吗?

再次感谢。

2 个答案:

答案 0 :(得分:1)

我要做的第一件事就是确认你对文件尚未准备好是对的。要做到这一点,请在写完后和阅读前将您的程序睡一两秒钟。几百KB不应该比准备好的时间更长。

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

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

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

答案 1 :(得分:0)

现在你已经添加了示例代码,我可以再说一些。

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

所以我支持你的预感。我认为您的文件可能尚未关闭,但在另一个正在处理记录数据的线程上以保存。

您可能希望设置NSTimer以尝试每隔一秒左右打开一次文件,这样您的用户界面就可以在完成后振作起来。您可能希望在此期间显示“请稍候”的消息,或者让用户知道它正在工作。