Вероятная проблема, с которой вы столкнулись, - обычная, и я часто ее ловлю, потому что ее легко пропустить ...
Допустим, у вас есть функция или скрипт, который открывает файл, считывает некоторые данные из него, а затем снова закрывает файл:
...
fid = fopen(fileName,'r');
%# Load your data here
fclose(fid);
...
Теперь, при первом запуске приведенного выше кода вы можете обнаружить, что допустили ошибку при загрузке данных (в конце концов, никто не идеален). Когда возникает эта ошибка, функция / скрипт завершает работу, игнорируя выполнение кода, следующего за строкой, в которой произошла ошибка (например, вызов FCLOSE ). Это означает, что у вас все еще есть дескриптор открытого файла.
Когда вы исправляете свою ошибку и повторно запускаете свой код, вы заканчиваете тем, что открываете новый дескриптор файла, который вы читаете и затем закрываете, и все это время, пока old открывается дескриптор файла все еще там. Как kwatford указывает , вы можете увидеть этот дескриптор открытого файла, используя функцию FOPEN .
Одним из решений является просто использовать fclose all
, как Джейкоб предлагает , закрывая каждый дескриптор открытого файла. Вы также можете выйти из MATLAB, который закрывает старый дескриптор файла и позволяет вам удалить ваш файл. При перезапуске MATLAB и повторном запуске (теперь без ошибок) кода у вас больше не возникает проблем с устаревшими дескрипторами файлов.
Я обсуждаю более отказоустойчивый способ работы с файловым вводом-выводом в моем ответе на связанный вопрос SO: Как вы обрабатываете ресурсы в MATLAB безопасным способом исключения? Мой ответ показывает, как onCLeanup
объекты могут помочь вам автоматически закрывать файлы, открываемые в функции, независимо от того, выполняется ли эта функция нормально или из-за ошибки. Этот подход может помочь вам избежать проблемы с сохранением открытых дескрипторов файлов.