2011-04-13 2 views
0

Может ли кто-нибудь сказать мне, как удалить файл в каталоге после его открытия и загрузки в базу данных?Как удалить файл из каталога с помощью 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 файла в каталоге. После того, как каждый файл будет загружен в базу данных, я хочу, чтобы все файлы были удалены из каталога.]

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

ответ

0

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

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

+0

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

+0

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

0

Согласно API:

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

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

+0

Да, спасибо, что указали это. – Anu

4

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

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(); 
} 
+0

Вы должны «закрыть» 'BufferedReader', а не' FileReader', так как закрытие первого будет закрывать оба. – mre

+0

Вы правы. Я просто пытался показать принцип. –

+0

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

0

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

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

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

+0

Да, спасибо за ваше предложение. Теперь это работает. – Anu

1

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

+0

Хорошо. Спасибо за ваш ответ. – Anu

0

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

Смежные вопросы