我的matlab代码创建了一个新文件,并在其中写入了一些内容。我使用fclose()来释放文件句柄但由于某些原因,当我尝试在程序完成执行后删除创建的文件时,我得到一个正在使用的文件错误。 关闭matlab后,可以删除该文件。
问题不是永久性的。我再次尝试了同样的事情而没有任何改变,它确实有效。
答案 0 :(得分:5)
我这么多次遇到过这个问题。您只需输入fclose all
,而不是关闭MATLAB。
大多数时候我在我的程序中使用fclose all
- 是的,我知道关闭MATLAB打开的所有文件,但有时在我的应用程序中,这没关系。将此答案视为建议而非完整解决方案。
答案 1 :(得分:5)
你可能遇到的问题是一个常见的问题,而且我经常遇到这个问题因为很容易错过......
假设你有一个打开文件的函数或脚本,从中读取一些数据,然后再次关闭文件:
...
fid = fopen(fileName,'r');
%# Load your data here
fclose(fid);
...
现在,第一次运行上面的代码时,您可能会发现在加载数据时出错了(毕竟没有人完美)。发生该错误时,函数/脚本将退出,忽略执行错误行之后的任何代码(如调用FCLOSE)。这意味着您仍然有一个打开的文件句柄。
当您更正错误并重新运行代码时,您最终会打开一个新文件句柄,您可以从中读取然后关闭该文件句柄,并且 old 打开文件句柄仍然存在。如kwatford points out,您可以使用FOPEN函数查看此打开文件句柄。
一种解决方案是将fclose all
用作Jacob suggests,关闭每个打开的文件句柄。您也可以退出MATLAB,它会关闭旧文件句柄并让您删除文件。当您重新启动MATLAB并重新运行(现在没有错误)代码时,您不再有延迟文件句柄的问题。
我讨论了一种更容错的方法来处理my answer中相关SO问题的文件IO:How do you handle resources in MATLAB in an exception safe manner?我的回答显示了onCLeanup
objects如何帮助您自动关闭文件在函数中打开,无论该函数是正常退出还是由于错误。这种方法可以帮助您避免延迟打开文件句柄的问题。
答案 2 :(得分:2)
您可能会多次意外打开文件。
使用fopen('all')
获取当前打开的文件句柄列表。然后,对于给定的文件句柄,使用fopen(fid)
查看其文件名是什么。使用这些来确定您是否多次打开同一个文件。