Подтвердить что ты не робот

Как узнать, почему renameTo() не удалось?

Я использую WinXP. Я использую java для создания списка файлов. Сначала файл будет создан как abc.txt.temp, и после завершения генерации он будет переименован в abc.txt.

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

Есть ли способ выяснить причину неудачи?

int maxRetries = 60;
logger.debug("retry");
while (maxRetries-- > 0)
{
    if (isSuccess = file.renameTo(file2))
    {
        break;
    }
    try
    {
        logger.debug("retry " + maxRetries);
        Thread.sleep(1000);
    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}

//file.renameTo(file2);
Thread.currentThread().getThreadGroup().getParent().list();

И результат:

[DEBUG][2009-08-25 08:57:52,386] - retry 1
[DEBUG][2009-08-25 08:57:53,386] - retry 0
java.lang.ThreadGroup[name=system,maxpri=10]
    Thread[Reference Handler,10,system]
    Thread[Finalizer,8,system]
    Thread[Signal Dispatcher,9,system]
    Thread[Attach Listener,5,system]
    java.lang.ThreadGroup[name=main,maxpri=10]
        Thread[main,5,main]
        Thread[log4j mail appender,5,main]
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false

Я хотел бы знать системный подход к выяснению причины. Спасибо.

4b9b3361

Ответ 1

Возможно, причиной отказа переименования является то, что файл все еще открыт. Даже если вы закрываете файл, его можно было бы открыть из-за (например):

  • Дескриптор файла наследуется подпроцессом вашего процесса
  • Антивирусная программа сканирует файл на наличие вирусов и открывает его
  • У индексатора (например, Google Desktop или службы индексирования Windows) открыт файл

Чтобы узнать, что поддерживает файл, используйте такие инструменты, как FileMon и Handle.

Обновление. Инструмент, такой как Unlocker, может не помочь, если файл остается открытым только в течение очень короткого времени (как в случае антивирусной проверки). Однако, если javaw.exe показан как открытый файл, ваша проблема прямо там.

Ответ 2

Три основных причины renameTo могут не работать (для Android, но вы также можете найти это полезным)!

1) Если вы перемещаете папки из места a в место b, папка назначения может быть файлом! Сделайте destinationFolder.mkdirs(), чтобы сделать его файлом!

2) Возможно, папка назначения уже существует! Удалите destinationFolder, чтобы вы могли использовать renameTo для перемещения старого файла в это новое место

3) Для перемещения внутреннего хранилища на внешнее хранилище требуется разрешение, поскольку для чтения и записи на SD-карту требуется разрешение!

Ответ 3

File o=new File("d:/old.txt");
File n=new File("d:/new.txt");
n.delete();
o.renameTo(n);

n.delete(): Нам нужно удалить файл (new.txt), если он существует.

o.rename(n): так, чтобы файл (old.txt) был переименован в new.txt

Ответ 4

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

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

Также возможно, что вы передали недопустимый путь или указали несуществующий путь к конструктору File.

renameTo() будет генерировать исключения только в случае нарушения безопасности (SecurityException) или если вы перейдете в null для переименованного файла.

Ответ 5

У меня была аналогичная проблема, но это с unix.
Переименовать случайно не удалось. Я перезапустил процесс 3 - 4 раза и, наконец, пошел на успех.
FYI файл был создан тем же процессом, и тот же процесс переименовывает его.

Ответ 6

Файл f = новый файл (папка + файл); проверьте, если у вас есть правильный путь. f.exists(); else существует и возвращает false проверять с procMon, если он выглядит..