Не удается удалить временную папку (иногда) - PullRequest
3 голосов
/ 12 июля 2011

При запуске приложения я создаю временную папку:

  public static File createTempDir(String name) throws IOException {
    File tempDir = File.createTempFile(name, "");
    if (!(tempDir.delete())) {
      throw new IOException("could not delete" + tempDir.getAbsolutePath());
    }

    if (!(tempDir.mkdir())) {
      throw new IOException("could not create" + tempDir.getAbsolutePath());
    }
    tempDir.deleteOnExit();
    return tempDir;
  }

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

Во время загрузки, когда старый временный каталог удаляется, я иногда получаю:

java.io.IOException: Невозможно удалить файл:

Вот как удаляется старая временная папка:

  public void cleanup(String tmpPath) {
    File tmpFolder = new File(tmpPath);
    if (tmpFolder != null && tmpFolder.isDirectory()) {
      try {
        FileUtils.deleteDirectory(file);
      } catch (IOException e) {
            e.printStackTrace();
      }
    } 
  }

где FileUtils: org.apache.commons.io.FileUtils. Обычно содержимое временной папки:

mytempfolder_uuid | -> mysubfolder | -> myImage.jpg

И ошибка:

java.io.IOException: Невозможно удалить файл: C: \ Users \ xxx \ AppData \ Local \ Temp \ mytempfolder_uuid \ mysubfolder \ myImage.jpg

Я попытался отладить приложение и перед выполнением операции удаления проверил, что вышеупомянутое изображение действительно находится в указанной папке.

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

Ответы [ 4 ]

3 голосов
/ 12 июля 2011

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

1 голос
/ 12 июля 2011

попробуйте удалить файлы из временной папки перед ее удалением.Попробуйте что-то вроде

private boolean deleteFolder(File path) {
    if (path.exists()) {
        File[] files = path.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                deleteFolder(f);
            } else {
                f.delete();
            }
        }
    }

    return path.delete();
}

, также используя deleteOnExit - не очень хорошая идея ...

ура!

1 голос
/ 12 июля 2011

Я бы посоветовал вам использовать библиотеку Guava.У него есть метод Files.createTempDir(), который делает именно то, что вам нужно:

Атомно создает новый каталог где-то под временным каталогом системы (как определено в java.io).системное свойство .tmpdir) и возвращает его имя.Используйте этот метод вместо File.createTempFile (String, String), когда вы хотите создать каталог, а не обычный файл. Распространенной ловушкой является вызов createTempFile, удаление файла и создание на его месте каталога, но это приводит к состоянию гонки, которое можно использовать для создания уязвимостей безопасности, особенно когда в каталог должны быть записаны исполняемые файлы. Этот метод предполагает, что временный том доступен для записи, имеет свободные иноды и свободные блоки и что он не будет вызываться тысячи раз в секунду.

0 голосов
/ 12 июля 2011
public static boolean deleteDir(String path)
{
    java.io.File dir = new java.io.File(path);
    if (dir.isDirectory())
    {
        String[] filesList = dir.list();
        for(String s : filesList)
        {
            boolean success = new java.io.File(dir, s).delete();
            if(!success)
            {
                return false;
            }
        }
    }
    return dir.delete();
}

и затем вы можете использовать его как: deleteDir("C:\\MyFolder\\subFolder\\")

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