2013-03-08 17 views
7

Ich habe Code, der entwickelt wird, um eine lokale Stammdatei zu öffnen, Ergänzungen vorzunehmen und die Datei sowohl durch Überschreiben der Stammdatei als auch durch Überschreiben einer schreibgeschützten Kopie an einem zugänglichen Netzwerkspeicherort zu speichern . Dies geschieht, indem Sie die geänderte Datei in eine temporäre Datei speichern und dann die anderen beiden Dateien kopieren.Java Files.copy ersetzen vorhandene löscht Datei vollständig

String tempFileName= "File.tmp"; 
String fileName= "File.xlsm"; 
String serverPath="\\\\network path\\"; 
File serverFile = new File(serverPath+fileName); 

Files.copy(Paths.get(tempFileName),Paths.get(fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

if(serverFile.exists()){serverFile.setWritable(true, false);} 

Files.copy(Paths.get(tempFileName),Paths.get(serverPath+fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

serverFile.setWritable(false,false); 

Files.delete(Paths.get(tempFileName)); 

Dieser Code funktioniert gut die meiste Zeit jedoch einen Teil der Zeit der Code erfolgreich ohne Ausnahme abgeschlossen ist, aber mit dem Netzwerkpfad-Datei gelöscht. Die lokale Masterdatei wird korrekt gespeichert und aktualisiert, aber die Datei, die im Netzwerk vorhanden sein sollte, ist einfach verschwunden.

Was es schwieriger macht ist, dass ich dieses Problem unter kontrollierten Umständen nicht reproduzieren konnte. Also frage ich Sie nach einer Anleitung, wie dies bei einer Dateikopier-/Überschreiboperation geschehen könnte.

Danke

UPDATE:

ich eine Ahnung hatte und kontrolliert den Netzwerkzugriff Protokolle an den Server-Dateipfad. Das Löschen der Datei findet nur dann statt, wenn auf die Datei von einem anderen Benutzer als dem Ersteller zugegriffen wird, aber nicht die ganze Zeit. Wiederum wird dies als schreibgeschützt bezeichnet, so dass ein Benutzer, der die Datei geöffnet hat, keine Auswirkungen auf das Überschreiben einer neuen Version haben sollte und die meiste Zeit nicht. Bei genauerem Hinsehen scheint es, dass gelegentlich genau dann, wenn die Datei von einem anderen Benutzer geöffnet wird und Java versucht, die Datei zu überschreiben, eine AccessDenied Exception ausgelöst wird und die Datei gelöscht wird.

Ich glaube, das muss ein Fehler in setWritable() oder Files.copy (oder einer Kombination) sein, da die Datei in keinem Fall gelöscht werden sollte und isWritable() jedes Mal wahr zurückgibt. Ich habe andere Methoden zum Setzen/UN-Setzen von Nur-Lesen-Berechtigungen ausprobiert und bin leer ausgegangen. Die aktuelle Arbeit, die ich an Stelle habe, fängt einfach die Ausnahme ab und führt eine Schleife durch, bis die Datei gelöscht ist und eine neue Kopie vorhanden ist. Das funktioniert, aber ist wirklich ein Hack, also wenn jemand bessere Lösungen/Vorschläge hat, begrüße ich sie.

+0

Wie groß ist Ihre Datei? Könnte es möglicherweise beim Trennen der Datei zu einer Netzwerkunterbrechung kommen? – Byron

+0

@Byron Das war meine einzige Arbeitstheorie, aber ich habe Netzwerk-Konnektivitätstests über lange Zeiträume ohne Aussetzer – David

+0

@Byron Auch die Datei wird schließlich groß sein, aber derzeit ist nur ~ 500k – David

Antwort

-2

Siehe How does FileLock work?, Sie so etwas wie tun könnte:

  1. Warten Datei
  2. Lock-Datei
  3. Überschreiben/Löschen/andere
  4. entriegeln (falls vorhanden) zur Verfügung werden

Dies sollte den Zugriff anderer Benutzer während des Prozesses zum Ändern der Datei verhindern.

+1

Wenn und nur wenn die anderen Benutzer auch Dateisperren verwenden. – EJP

+0

Ich nehme an, es hängt von der Dateisystemimplementierung ab, aber in meinen lokalen Tests kann ich, wenn ich eine Datei sperre, die programmatische Sperre nicht manuell entfernen, diese Datei löschen, schreiben oder umbenennen, solange die Sperre offen ist.Ich bin mir also nicht sicher, warum ich hier abgelehnt wurde! – Fallso

Verwandte Themen