wake-up-neo.com

Wie kann ich herausfinden, warum renameTo () fehlgeschlagen ist?

Ich verwende WinXP. Ich verwende Java, um eine Liste von Dateien zu erstellen. Die Datei wird zunächst als abc.txt.temp erstellt und nach Abschluss der Generierung in abc.txt umbenannt.

Beim Erstellen der Dateien konnten einige Dateien jedoch nicht umbenannt werden. Es geschieht zufällig.

Gibt es überhaupt einen Grund, warum es versagt hat?

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();

Und das Ergebnis:

[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

Ich würde gerne einen systematischen Ansatz wissen, um den Grund herauszufinden. Vielen Dank.

29
janetsmith

Es ist möglich, dass der Grund für das Umbenennen fehlgeschlagen ist, dass die Datei noch geöffnet ist. Auch wenn Sie die Datei schließen, kann sie (zB) offen gehalten werden:

  1. Ein Datei-Handle wird von einem Unterprozess Ihres Prozesses vererbt
  2. Ein Antivirenprogramm prüft die Datei auf Viren und hat diese geöffnet
  3. Bei einem Indexer (wie Google Desktop oder dem Windows-Indexierungsdienst) ist die Datei geöffnet

Um herauszufinden, was die Datei geöffnet hält, verwenden Sie Tools wie FileMon und Handle .

Update: Ein Tool wie Unlocker ist möglicherweise nicht hilfreich, wenn die Datei nur für sehr kurze Zeit offen gehalten wird (wie dies bei einer Virenprüfung der Fall wäre). Wenn jedoch gezeigt wird, dass javaw.exe die Datei geöffnet hat, ist dies genau dort Ihr Problem.

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

n.delete(): Falls vorhanden, müssen wir die Datei (new.txt) löschen.

o.rename(n): damit die Datei (old.txt) in new.txt umbenannt wird 

3
Sathish

Drei Hauptgründe, warum renameTo fehlschlagen kann (für Android, Sie können dies jedoch auch als nützlich erachten)! 

1) Wenn Sie Ordner von Ort a nach Ort b verschieben, kann der Zielordner eine Datei sein! Machen Sie den destinationFolder.mkdirs () zu einer Datei!

2) Der Zielordner ist möglicherweise bereits vorhanden! Löschen Sie den destinationFolder, damit Sie mit renameTo die alte Datei an diesen neuen Speicherort verschieben können

3) Das Verschieben des internen Speichers in einen externen Speicher erfordert eine Genehmigung, da das Lesen und Schreiben auf die SD-Karte eine Genehmigung erfordert!

3
coolcool1994

Wenn keine Ausnahmen ausgelöst wurden (ich nehme an, Sie hätten das bemerkt), gibt renameTo() nur true oder false zurück, um anzuzeigen, ob die Umbenennung erfolgreich war oder nicht, und es werden keine zusätzlichen Informationen angezeigt. 

Da es sich um Windows handelt, weist ein Fehler höchstwahrscheinlich darauf hin, dass die Datei derzeit verwendet wird. Dies würde passieren, weil ein anderer Prozess es geöffnet hat. Wahrscheinlicher ist, dass Ihr Prozess entweder nicht fertig geschrieben ist oder Sie vergessen haben, die Datei zu schließen, nachdem Sie sie fertig geschrieben haben.

Es ist auch möglich, dass Sie einen ungültigen Pfad übergeben haben oder dem File-Konstruktor einen nicht vorhandenen Pfad angegeben haben.

renameTo() gibt nur dann Ausnahmen aus, wenn eine Sicherheitsverletzung (SecurityException) vorliegt oder Sie eine null für die umzubenennende Datei übergeben.

2
Dave Ray

Ich hatte ein ähnliches Problem, aber das ist bei Unix.
.__ Die zufällige Umbenennung ist fehlgeschlagen. Ich habe den Prozess 3 bis 4 Mal neu gestartet und war schließlich erfolgreich.
FYI Die Datei wurde von demselben Prozess erstellt und derselbe Prozess benennt sie um.

1
prashanth

Es ist auch möglich, dass Sie die Datei möglicherweise nicht umbenennen, da Sie nicht über ausreichende Berechtigungen verfügen. Unter Unix ist das einfach. Auf Win10, na ja ... siehe z. https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html

0
Per Lindberg