Как закрыть дескриптор файла в Matlab? - PullRequest
10 голосов
/ 07 марта 2011

Мой код Matlab создает новый файл и записывает некоторые вещи в нем. Я использую fclose () для освобождения дескриптора файла, но по некоторым причинам, когда я пытаюсь удалить созданный файл после завершения выполнения программы, я получаю сообщение об ошибке использования файла. Файл можно удалить, как только я закрою Matlab.

Проблема не является постоянной. Я попробовал то же самое снова без каких-либо изменений, и это работает.

Ответы [ 3 ]

5 голосов
/ 07 марта 2011

У меня была такая проблема, так много раз. Вместо закрытия MATLAB вы можете просто набрать fclose all.

Большую часть времени я использую fclose all в своих программах - да, я знаю, что закрывает все файлы, открытые MATLAB, но иногда в моем приложении это нормально. Считайте этот ответ рекомендацией, а не полным решением.

5 голосов
/ 07 марта 2011

Вероятная проблема, с которой вы столкнулись, - обычная, и я часто ее ловлю, потому что ее легко пропустить ...

Допустим, у вас есть функция или скрипт, который открывает файл, считывает некоторые данные из него, а затем снова закрывает файл:

...
fid = fopen(fileName,'r');
%# Load your data here
fclose(fid);
...

Теперь, при первом запуске приведенного выше кода вы можете обнаружить, что допустили ошибку при загрузке данных (в конце концов, никто не идеален). Когда возникает эта ошибка, функция / скрипт завершает работу, игнорируя выполнение кода, следующего за строкой, в которой произошла ошибка (например, вызов FCLOSE ). Это означает, что у вас все еще есть дескриптор открытого файла.

Когда вы исправляете свою ошибку и повторно запускаете свой код, вы заканчиваете тем, что открываете новый дескриптор файла, который вы читаете и затем закрываете, и все это время, пока old открывается дескриптор файла все еще там. Как kwatford указывает , вы можете увидеть этот дескриптор открытого файла, используя функцию FOPEN .

Одним из решений является просто использовать fclose all, как Джейкоб предлагает , закрывая каждый дескриптор открытого файла. Вы также можете выйти из MATLAB, который закрывает старый дескриптор файла и позволяет вам удалить ваш файл. При перезапуске MATLAB и повторном запуске (теперь без ошибок) кода у вас больше не возникает проблем с устаревшими дескрипторами файлов.

Я обсуждаю более отказоустойчивый способ работы с файловым вводом-выводом в моем ответе на связанный вопрос SO: Как вы обрабатываете ресурсы в MATLAB безопасным способом исключения? Мой ответ показывает, как onCLeanup объекты могут помочь вам автоматически закрывать файлы, открываемые в функции, независимо от того, выполняется ли эта функция нормально или из-за ошибки. Этот подход может помочь вам избежать проблемы с сохранением открытых дескрипторов файлов.

2 голосов
/ 07 марта 2011

Возможно, вы случайно открыли файл несколько раз.

Используйте fopen('all'), чтобы получить список текущих открытых дескрипторов файла.Затем, для данного дескриптора файла, используйте fopen(fid), чтобы увидеть, каково его имя файла.Используйте их, чтобы определить, открываете ли вы один и тот же файл несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...