2009-08-25 5 views
27

Ich benutze WinXP. Ich benutze Java, um eine Liste von Dateien zu erstellen. Die Datei wird zuerst als abc.txt.temp erstellt und nach Abschluss der Generierung wird sie in abc.txt umbenannt.Wie finde ich heraus, warum renameTo() fehlgeschlagen ist?

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

Gibt es trotzdem den Grund warum es fehlgeschlagen ist?

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 mag würde einen systematischen Ansatz wissen, den Grund herauszufinden. Vielen Dank.

+0

Fangen Sie irgendwelche Ausnahmen, die ausgelöst werden? – seth

+0

nein. keine Ausnahme. Es gibt nur falsch zurück. – janetsmith

+0

Ich aktualisierte meine Antwort. –

Antwort

24

Es ist möglich, dass der Grund für die Umbenennung fehlgeschlagen ist, weil die Datei noch geöffnet ist. Auch wenn Sie die Datei schließen, könnte es offen gehalten werden, da die (zum Beispiel):

  1. Eine Datei-Handle wird durch einen Teilprozess des Prozesses geerbt
  2. Ein Anti-Viren-Programm scannt die Datei für Viren, und so hat es offen
  3. Indexer (wie Google Desktop oder der Indexdienst Windows) die Datei geöffnet hat

zu helfen, herauszufinden, was die Datei geöffnet hält, verwenden Werkzeuge wie FileMon und Handle.

Update: Ein Tool wie Unlocker kann nicht helfen, wenn die Datei nur für eine sehr kurze Zeit offen gehalten wird (wie bei einem Anti-Virus-Scan). Wenn javaw.exe jedoch als geöffnet angezeigt wird, ist das Ihr Problem.

+0

Ich benutze Unlocker. und es zeigt nur "javaw.exe" als das einzige Schließfach. :( – janetsmith

+0

Ich würde denken, dass das Scannen von Anwendungen wie Antivirus und Indexer nicht in der Lage sein sollte, die Datei zu halten und zu verhindern, dass sie geändert oder umbenannt wird ... Ist dies tatsächlich in WinXP? – Yuval

+0

Sie halten nicht die Datei öffnen für lange, aber in der Regel nach Dateiänderungen suchen und nach Updates der Datei scannen.Wenn Sie in eine Datei schreiben, schließen Sie es und versuchen Sie es dann umzubenennen, die Datei * konnte * zu diesem Zeitpunkt noch offen gehalten werden (obwohl nicht lang) –

2

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

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 es jedoch, dass Ihr Prozess entweder nicht fertig geschrieben wurde 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 einen nicht vorhandenen Pfad zum File-Konstruktor angegeben haben.

wird nur Ausnahmen auslösen, wenn eine Sicherheitsverletzung vorliegt (SecurityException) oder wenn Sie eine null für die Datei zum Umbenennen übergeben.

+1

Ich weiß, dass es falsch zurückgibt, aber es gibt keine Ahnung, warum es fehlgeschlagen ist. Ich habe alle outputStream.close() geschlossen und auf null gesetzt. Aber es ist immer noch fehlgeschlagen. Lassen Sie uns sagen, dass ich 10 Dateien erzeugt habe, file0.tmp ... file9.tmp, es kann sein, dass file5.tmp nicht in file5.txt geändert werden konnte. – janetsmith

1

Ich hatte ein ähnliches Problem, aber das ist mit Unix.
Die Umbenennung ist zufällig fehlgeschlagen. Ich habe den Prozess 3 bis 4 mal neu gestartet und bin schließlich zum Erfolg gegangen.
FYI die Datei wurde durch den gleichen Prozess erstellt und derselbe Prozess benennt es um ..

-4

Datei f = neue Datei (Ordner + Datei); überprüfen mit, wenn Sie den richtigen Pfad schreiben .. f.exists(); else ist exist und gibt false verify mit procMon zurück wenn es aussieht ..

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

n.delete(): Wir brauchen die Datei (new.txt) zu löschen, wenn vorhanden.

o.rename(n): so, dass die Datei (old.txt) als new.txt

umbenannt
+2

Ich habe genau das gemacht und bin immer noch falsch von der Umbenennung zurückgekommen. Die Datei wurde geschlossen und nichts anderes hatte sie. Windows. Nur ... Windows. – stu

3

drei Hauptgründe renameTo ausfallen können (für Android, aber auch dies nützlich sein können)!

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

2) Der Zielordner existiert möglicherweise bereits! Löschen Sie den Zielordner, damit Sie die alte Datei mithilfe von renameTo an den neuen Speicherort verschieben können

3) Das Verschieben von internem Speicher auf externen Speicher erfordert eine Berechtigung, da Lesen und Schreiben auf SD-Karte erforderlich ist!

+0

Ich fand diese Frage über Google, und # 2 war mein Problem Vielen Dank für die Hilfe! –

+1

"Machen Sie die Datei destinationFolder.mkdirs(), um es zu einer Datei zu machen!" Huh? – EntangledLoops

Verwandte Themen