简短版本:我想我太快要求提供一个文件了,但它假装已经准备好了。我错过了什么吗?
版本稍长:我正在将文件写入磁盘。在我这样做之前,我让用户添加一些元数据,包括新文件名。用户完成后,屏幕消失,程序将文件写入磁盘。然后,用户可以查看文件列表。该列表是通过读取文件夹的内容生成的。新文件位于文件列表中,但是当我尝试从文件中提取信息以显示(例如文件大小)时,程序崩溃。我尽力而为,崩溃的原因是,虽然文件名在那里,但是无法读取。 (顺便说一下,这些都是小文件 - 几百k。)
首先,文件是否可能出现在目录中,但还不是全部? 一个 第二,如果是这样,我如何检查文件是否可以读取?
非常感谢。
更新
感谢。我会尝试添加更多信息。我正在用AVAudioRecorder录制一个音频文件。 init行是:
soundrecording = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];
该程序通过它的UI更新和计量以及所有这些。当音频停止时,我打电话给:
[soundrecording stop];
当其他所有内容都更新并准备好继续前进时,我打电话给:
[soundrecording release];
soundrecording=NULL;
据我了解,这应该照顾发布文件,是吗?
再次感谢。
答案 0 :(得分:1)
我要做的第一件事就是确认你对文件尚未准备好是对的。要做到这一点,请在写完后和阅读前将您的程序睡一两秒钟。几百KB不应该比准备好的时间更长。
如果它仍然失败,我的猜测是你还没有关闭用来编写它的文件句柄。它可能没有准备好阅读,因为文件系统认为你可能会继续写作。
通常,检查文件是否准备就绪的方法是尝试打开它。如果成功,您可以阅读它。或者,如果失败并出现错误,您可以优雅地处理错误:
答案 1 :(得分:0)
现在你已经添加了示例代码,我可以再说一些。
首先,class reference似乎表示stop
方法会关闭文件。然而,它似乎也表明存在潜在的音频会话,可能还有一些转换。我想我记得iPhone的Voice Notes应用程序,可能使用这个API,必须做一些工作来压缩长时间录制完成后。
所以我支持你的预感。我认为您的文件可能尚未关闭,但在另一个正在处理记录数据的线程上以保存。
您可能希望设置NSTimer
以尝试每隔一秒左右打开一次文件,这样您的用户界面就可以在完成后振作起来。您可能希望在此期间显示“请稍候”的消息,或者让用户知道它正在工作。