Как закрыть дескриптор файла в MATLAB?

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

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

3 ответов


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

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

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

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

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

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

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


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

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


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

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