A есть такая проблема: есть некоторые RandomAccessFiles, которые открываются через алгоритм. Функция, в которой они используются, рекурсивна. Я не могу закрыть их (если я это сделаю, я разрушу алгоритм). Есть ли способ закрыть их (удалить потом)?Не удается удалить файл
ответ
Вы можете использовать File.deleteOnExit()
, тогда файлы будут автоматически удалены при завершении JVM.
Начните с нерекурсивной подпрограммы, которая открывает файл, передает его вашей рекурсивной подпрограмме, а затем закрывает ее, когда заканчивается рекурсивная подпрограмма.
+1: вы ** должны ** закрыть его. – BalusC
Каждая рекурсивная функция должна иметь какое-то условие прерывания. Просто удалите файл в конце вашего рекурсии.
КПП. вы должны закрыть каждый файл, который вы открываете, если ваша функциональная структура не позволяет вам это сделать, вы должны его изменить.
Неверная ошибка? – Dmitry
Есть целый ряд способов для решения этой проблемы в зависимости от деталей вашей проблемы:
Если у вас есть только 1 файл, используйте решение @Bill Д.К. открытия файла в нерекурсивна рутине до ввода рекурсивной части является хорошим подходом.
Если у вас есть небольшое количество файлов для открытия, создайте себе класс «файловый менеджер» с помощью одного метода, который откроет новый файл по запросу и второй метод, который закроет и удалит все открытые файлы. Измените алгоритм открытия файлов с помощью диспетчера файлов и поместите вызов метода «закрыть все» в предложении finally try/finally, окружающем рекурсивный алгоритм.
Если у вас есть произвольно большое количество файлов, которые нужно открыть, вам придется перепроектировать ваш алгоритм, чтобы можно было удобно закрыть их по требованию разумным способом. Или измените алгоритм так, чтобы ему не нужно было использовать столько файлов. Решение
@Michael Borgwardt»(не закрывать файл на всех, и пометить его как удалить-на-выход) потенциально хрупкое, особенно если алгоритм должен открыть большое количество этих файлов. На многих платформах ОС на каждый процесс ограничено количество открытых файлов.
Спасибо, я попробую это – Dmitry
Невозможно описать алгоритм, но даже если вы используете рекурсивную реализацию, вы сможете закрыть его при рекурсивном возврате.
Другой подход, чтобы открыть и закрыть файл вне рекурсивной функции:
Например:
main() {
File file = openFile()
recursiveFunction(file); // do whatever is needed and pass the file as arg
file.close()
}
Или открыть и закрыть файл в рекурсивной функции
void recursiveFunction() {
File file = openFile()
doX
doY
if(finished()) { // guard condition executed when returning from the recursion
closeFile()
} else {
recursiveFunction()
}
}
- 1. Не удается удалить файл
- 2. Не удается удалить файл XML
- 3. Удалить файл Синхронно не удается найти файл
- 4. Не удается удалить файл в попытке поймать
- 5. Не удается удалить файл с детьми
- 6. Не удается удалить файл в Android
- 7. Не удается удалить файл псевдонима mac
- 8. Не удается удалить файл с помощью rm
- 9. Не удается удалить файл после загрузки
- 10. Не удается удалить файл из git commit
- 11. Не удается удалить файл с JSP
- 12. Не удается удалить файл из рабочего каталога
- 13. Не удается удалить папку, содержащую файл
- 14. Не удается удалить файл FileField в post_delete
- 15. Не удается удалить файл после выполнения операций
- 16. Не удается удалить файл из SDCard
- 17. iPhone/Objective C: Не удается удалить файл
- 18. Не удается удалить zip-файл после распаковки?
- 19. Не удается удалить файл: Сбой SFTP
- 20. Не удается удалить файл, но авторы закрыты
- 21. OSSEC install, не удается удалить файл
- 22. Не удается удалить большой файл из EGit
- 23. Python: Не удается удалить файл после записи
- 24. Не удается удалить файл после его записи
- 25. Не удается удалить файл на вкладке развертывания
- 26. Не удается удалить файл tar.gz с хрон
- 27. Не удается удалить файл с File.Delete (путь)
- 28. Не удается удалить файл в C
- 29. Не удается удалить файл в PHP
- 30. не удается удалить файл с помощью os.remove()
Не будет если он нуждается в очистке, но продолжит работу (например, на сервере или в более длинном рабочем приложении). –
Да, согласен. Это только удаление – Dmitry