Как удалить файл из каталога с помощью Java?

#java #file

#java #файл

Вопрос:

Кто-нибудь, пожалуйста, может сказать мне, как удалить файл из каталога после открытия и загрузки в базу данных?

Вот мой код:

 public static void main(String[] args) throws SQLException{

        int Count= 0;

        File directory = new File("C://Documents and Settings//welcome//My Documents//Bluetooth Exchange Folder");
        directory.deleteOnExit();
        File files[] = directory.listFiles();

        for(int index = 0; index < files.length; index  ){

            try {

                FileReader inp = new FileReader (files[index]);
                BufferedReader buf = new BufferedReader(inp);
                String strLine;

                try {
                    while ((strLine = buf.readLine()) != null)
                    {
                        System.out.println(strLine);

                        String[] dbColumnValues = strLine.split("%");

                        Connect.DoInsertIntoDB(Long.parseLong(dbColumnValues[0]),dbColumnValues[1],dbColumnValues[2], dbColumnValues[3]);
                        Count  ;
                        System.out.println(Count   " Row(s) are inserted into the Database");
                        GenHTML.gen();

                    }

                } 
  

Но файлы в каталоге не удаляются.
Пожалуйста, кто-нибудь может исправить ошибку в моем коде?

[В настоящее время я тестирую с 3 файлами в каталоге. После загрузки каждого файла в базу данных я хочу, чтобы каждый файл удалялся из каталога.]

Заранее спасибо!

Ответ №1:

Лучше быть явным в вашем коде.

 File files[] = directory.listFiles();
for(int index = 0; index < files.length; index  ){
{
   // Process files[index]
   // ...
   boolean wasDeleted = files[index].delete();
   if (!wasDeleted)
   {
     // Deal with error
   }
}
  

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

 FileReader inp = new FileReader (files[index]);
try
{
  // ...
}
finally
{
  inp.close();
}
  

Комментарии:

1. Вы должны close BufferedReader , а не FileReader поскольку закрытие первого приведет к закрытию обоих.

2. Да!! Большое спасибо! Это действительно помогло. Теперь файлы удаляются из каталога.

Ответ №2:

Методы File.delete() и File.deleteOnExit() удалят каталог, только если он пуст. Вам придется удалять файлы из каталога по мере их обработки (и убедитесь, что там нет подкаталогов). В качестве альтернативы вы можете использовать FileUtils.deleteDirectory() из Apache Commons IO в конце вашей обработки.

Ответ №3:

Двойные косые черты кажутся подозрительными. Либо используйте единственную обратную косую черту, которую вам нужно заключить в кавычки как \ , либо используйте единственную косую черту / .

Кроме того, вы могли бы попробовать использовать метод delete() when then возвращает вместо deleteOnExit() .

Комментарии:

1. Это должен быть комментарий, а не ответ.

2. Но на самом деле, данные из файлов нормально загружаются в базу данных, что означает, что файлы из каталога идентифицированы. Итак, я думаю, косая черта — это не проблема

Ответ №4:

Согласно API:

Запрашивает удаление файла или каталога, обозначенного этим абстрактным путем, при завершении работы виртуальной машины.

Однако в вашем коде вы обрабатываете эту функцию так, как будто она немедленно удаляет каталог.

Ответ №5:

Вы не можете удалить каталог, если он не пуст. Если каталог не пуст, необходимо сначала рекурсивно удалить все файлы и подкаталоги в каталоге.

Таким образом, directory.deleteOnExit() в вашем случае не будет работать.

Более того, я предлагаю вам явно удалять файлы, не используя deleteOnExit(). Это тупая функция, которая не удалит файл при выходе, если все потоки ввода / вывода, связанные с файлом, не закрыты. Всегда закрывайте потоки и явно удаляйте файлы, а затем каталог.

Ответ №6:

Возможно, что вам нужно сделать, это использовать метод dispose() для компонента, который открывает файл. Возможно, ситуация заключается в том, что файл по-прежнему рассматривается как открытый и заблокированный компонентом, в котором он был открыт, поэтому вы должны убедиться, что используете dispose() метод для решения этой проблемы.