Как узнать, почему renameTo () не удалось? - PullRequest
29 голосов
/ 25 августа 2009

Я использую 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

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

Ответы [ 7 ]

28 голосов
/ 25 августа 2009

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

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

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

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

3 голосов
/ 15 декабря 2014

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

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

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

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

3 голосов
/ 11 октября 2012
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

2 голосов
/ 25 августа 2009

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

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

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

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

1 голос
/ 03 января 2012

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

0 голосов
/ 15 июня 2018

Также возможно, что вы не сможете переименовать файл, потому что у вас недостаточно прав. На Unix это просто. На Win10 хорошо ... см. Например https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html

0 голосов
/ 07 января 2012

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

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