【问题标题】:Is a file available to be opened?有可以打开的文件吗?
【发布时间】:2009-12-23 03:52:31
【问题描述】:

短版:我想我要求文件太早了,但它假装它已经准备好了。我错过了什么吗?

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

首先,是否有可能文件显示在目录中但还没有全部存在? 一种 其次,如果是,我如何检查文件是否可以读取?

非常感谢。

更新:

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

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

程序会进行 UI 更新和计量等等。当音频停止时,我调用:

[soundrecording stop];

当其他一切都更新并准备好继续前进时,我打电话:

[soundrecording release];
soundrecording=NULL;

据我了解,这应该负责释放文件,是吗?

再次感谢。

【问题讨论】:

  • 这和 Objective-C 有什么关系?您还没有告诉我们您遇到了什么样的崩溃,以及您如何尝试获取文件的大小。如果您需要帮助,您必须告诉我们的不仅仅是您的假设。
  • 这个问题及其答案可能对每个人都更有用,如果您愿意发布您的代码示例,并指出错误发生的位置。
  • 谢谢。我在上面添加了更多信息。

标签: objective-c file audio avaudiorecorder


【解决方案1】:

我要做的第一件事是确认您对文件尚未准备好的看法是正确的。要做到这一点,在写作之后和阅读之前让你的程序休眠一两秒钟。几百 KB 的准备时间应该不会超过这个时间。

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

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

  • 在命令行实用程序中,您可能会打印错误并退出,用户可以重试。
  • 如果它是不应退出的后台程序,例如服务器,您可以记录错误。您也可以在延迟后自动重试。如果这是一个大错误,您可能希望程序通过电子邮件通知您。
  • 在 GUI 窗口应用程序中,您可能希望显示错误对话框或面板,然后让用户有机会重试。

【讨论】:

  • 这是我的猜测。读取访问被拒绝,因为它仍然可以写入。
  • 我在上面添加了更具体的信息。
【解决方案2】:

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

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

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

您可能希望设置NSTimer 以尝试每隔一秒左右打开文件,以便您的用户界面在完成后可以恢复活力。您可能希望在此期间显示“请稍候”之类的消息,或者让用户知道它正在工作。

【讨论】:

  • 谢谢。看起来文件没有被释放。在 AVAudioRecorder 停止并释放并且用户调用菜单后,我有: NSString* filePath=[[NSBundle mainBundle] pathForResource:fileName ofType:@"wav" inDirectory:@"../Documents"]; while([[NSFileManager defaultManager] isReadableFileAtPath:filePath]==NO){ NSLog(@"准备好了吗?"); [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];它只是坐在那里打印出“准备好了吗?”永远。知道如何追踪音频文件中保存的内容吗?再次感谢。
  • 也许它永远不会被编写,因为你不小心在沙箱之外。尝试以规范方式获取 Documents 文件夹: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0];
  • 谢谢。我知道正在写入文件,因为崩溃后,我重新打开应用程序并且文件在那里。同时,我注意到只有在记录文件之前打开列表时,新文件才会导致挂起。 (即打开列表视图(通常是删除前一个文件),关闭列表视图,打开记录视图,记录一个文件,关闭记录视图,然后再次打开列表视图,此时它会挂起。)我猜这意味着问题在于我如何重用列表视图。我每次关闭都会发布列表并重新创建每个打开的列表,所以我不确定会发生什么。无论如何,谢谢。
  • 我建议你在列表视图控制器的dealloc 中放置一个断点。如果它完全释放,这是一种判断方式。您也可以尝试使用 Instruments 查找泄漏。
猜你喜欢
  • 2017-09-15
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多