Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否有可打开的文件?_Objective C_File_Audio_Avaudiorecorder - Fatal编程技术网

Objective c 是否有可打开的文件?

Objective c 是否有可打开的文件?,objective-c,file,audio,avaudiorecorder,Objective C,File,Audio,Avaudiorecorder,简短版本:我想我要求的文件太早了,但它假装它已经准备好了。我错过什么了吗 略长的版本:我正在将文件写入磁盘。在此之前,我让用户添加一些元数据,包括新的文件名。用户完成后,屏幕消失,程序将文件写入磁盘。然后,用户可以查看文件列表。该列表是通过读取文件夹的内容生成的。新文件在文件列表中,但当我试图从文件中提取信息以显示(例如文件大小)时,程序崩溃。据我所知,崩溃发生的原因是,虽然文件名在那里,但无法读取。(顺便说一句,这些是小文件——几十万个。) 首先,是否可能有一个文件显示在目录中,但尚未全部显示

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

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

首先,是否可能有一个文件显示在目录中,但尚未全部显示? A. 第二,如果是这样,我如何检查文件是否准备好读取

多谢

更新:

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

soundrecording = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];
这个程序需要进行UI更新和计量等。当音频停止时,我调用:

[soundrecording stop];
当其他一切都更新并准备好继续时,我呼吁:

[soundrecording release];
soundrecording=NULL;
据我所知,这应该是释放文件的时候了,是吗


再次感谢。

我要做的第一件事是确认您关于文件尚未准备好的说法是正确的。要做到这一点,请在编写程序之后和阅读之前先将程序休眠一两秒钟。几百KB的存储空间不应该比这个时间长

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

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

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

现在您已经添加了示例代码,我可以说更多

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

所以我支持你的直觉。我认为您的文件可能尚未关闭,但在另一个线程上,该线程正在将记录的数据处理为适当的格式以进行保存


您可能希望设置一个
NSTimer
来尝试每隔一秒左右打开一次文件,这样您的用户界面就可以在完成后重新启动。您可能希望同时显示“请稍候”之类的消息,或者让用户知道它正在工作。

这与Objective-C有什么关系?您还没有告诉我们您遇到了什么样的崩溃,以及您如何尝试获取文件的大小。如果您需要帮助,您必须告诉我们的不仅仅是您的假设。如果您能发布代码示例,并指出错误发生的位置,那么这个问题及其答案可能对每个人都更有用。谢谢。我在上面添加了更多信息。这是我的猜测。读取访问被拒绝,因为它仍然可以写入。我在上面添加了更具体的信息。谢谢。看起来文件没有被释放。在AVAudioRecorder停止并释放并且用户调用菜单后,我有:NSString*filePath=[[NSBundle mainBundle]pathForResource:FileOfType:@“wav”inDirectory:@./Documents“];而([[NSFileManager defaultManager]isReadableFileAtPath:filePath]==NO){NSLog(@“ready?”);[[nsrunlop currentRunLoop]runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];}它只是坐在那里永远打印“ready?”。你知道我该如何追踪音频文件的内容吗?再次感谢。也许它从来没有被写过,因为你不小心在沙箱外面。尝试以规范的方式获取Documents文件夹:NSArray*path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*documentsDirectory=[paths objectAtIndex:0];谢谢我知道文件正在被写入,因为崩溃后,我重新打开应用程序,文件就在那里。同时,我注意到只有在录制文件之前打开列表时,新文件才会导致挂起。(例如,打开列表视图(通常用于删除以前的文件),关闭列表视图,打开记录视图,记录文件,关闭记录视图,然后再次打开列表视图,此时它将挂起。)我想这意味着问题在于如何重用列表视图。我会在每次收盘时都发布列表,并重新创建每次开盘,所以我不确定会发生什么。无论如何,谢谢。我建议您在列表视图控制器的
dealloc
中设置一个断点。如果它被完全释放,这是一种判断方法。您也可以尝试使用仪器查找泄漏。