Как удалить файлы с флешки?Использование File.delete () не работает - PullRequest
0 голосов
/ 26 января 2011

после создания файла и заполнения его потоком, если файл находится на USB-диске, ява не может удалить его, когда я пытаюсь на диске, он удаляет файл, хорошо!

Вот частькода, который создается и после исключения при попытке удалить файл.

           if(canExport && fileCreated)
           {
              //Create the file
              this.file.createNewFile();

              //Export the data            
              this.run();

              if(possible == false){ // in case writing fails delete the file created.
                 file.delete();    

                 Export novaTentativa = new Export(plan);
                 novaTentativa.fileCreator(plan);                 
              }
           }

Файл создается, когда действует this.file.createNewFile ().

Когда this.run () выполняется, есть много методов для заполнения данных и обрабатывает исключения , если одно исключение перехватывается, он устанавливает глобальную возможную переменную в false, такЯ знаю, что файл создан, но пустой на USB, после этого я пытаюсь удалить его с помощью file.delete ();

Ответы [ 3 ]

2 голосов
/ 26 января 2011

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

Если исключениеБрошенный более ранними методами (например, вызовом createNewFile()), это исключение будет немедленно распространяться вверх, поэтому ваш вызов file.delete() не сможет выполнить.Вам нужно было обернуть предыдущие операторы в блок try и поместить вызов delete в соответствующий блок catch или finally, чтобы он выполнялся при возникновении исключения.

Вот пример того, что вы можете попытаться сделать:

if(canExport && fileCreated)
{
    //Create the file
    this.file.createNewFile();

    try
    {
        this.run();
    }
    catch (IOException e)
    {
        try
        {
            file.delete();
        }
        catch (IOException ignore) {} // don't want to mask the real exception

        // Rethrow the actual exception from run() so callers can handle it
        throw e;
    }
}

Альтернативный подход, вместо того, чтобы поймать IOExceptions, состоит в том, чтобы иметь блок finally (который всегда выполняется), а затем проверить условие тамНапример, ваш possible флаг.

Также обратите внимание, что я запускаю блок try после вызова createNewFile() - если в вызове create file выдается исключение, тогдафайл вообще не существует для удаления!

Как примечание к файлу, добавление «большого количества кода, требующего запуска потока заново» в вашем блоке обработки ошибок, вероятно, не лучший дизайн.Было бы более уместно просто рассмотреть возможность восстановления из ситуаций ввода-вывода, и позволил исключению всплыть наверх и заставить поток / runnable умереть.Логика вокруг перезапуска задач и / или воскрешения потоков была бы лучше позиционирована с классом, который запустил потоки в первую очередь (например, пул потоков / исполнитель задач / и т.д.).Разброс логики по всему коду усложнит понимание того, что делает какой-либо отдельный класс (не говоря уже о том, что наличие ресурсов класса Marshall для воскрешения * просто кажется неправильным с точки зрения ОО).

0 голосов
/ 27 января 2011

Насколько вы уверены, что вы закрыли файл, когда запись не удалась?Готов поспорить, что вы пропустили последний блок где-то в this.run ().Это приведет именно к описанному вами поведению - delete () завершится с ошибкой, если файл открыт (вы должны проверить его код возврата - File.delete () не выдает исключения, если не может удалить файл).*

Если вы хотите проверить это, замените this.run () на супер, сумасшедшую простую реализацию, которая записывает в файл 100 байт, устанавливает false в значение false и возвращаетЕсли файл по-прежнему не удаляется, опубликуйте код, который вы используете для этой упрощенной версии run (), и, возможно, кто-то сможет определить, что происходит.

0 голосов
/ 26 января 2011

Попробуйте явно указать букву диска, путь и папку для доступа к USB-устройству для создания записи и чтения или удаления файла. Если это не сработает, то возможно, что только конкретная служебная программа или служебная программа может удалить файл.

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