Les Fichiers Java.copier remplacer les supprime entièrement

J'ai un code qui est conçu pour l'ouverture d'un fichier maître, de faire des ajouts, et enregistrez le fichier en écrasant le fichier maître et de l'écrasement d'un protégé en écriture de copie sur un emplacement réseau accessible. Ceci est fait en enregistrant le fichier modifié dans un fichier temporaire, puis de le copier sur les deux autres fichiers.

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

Ce code fonctionne bien la plupart du temps cependant, de temps en temps le code se termine avec succès, sans exception, mais avec le réseau de l'emplacement du fichier supprimé. Le maître du fichier est enregistré et mis à jour correctement, mais le fichier doit exister sur le réseau est tout simplement disparu.

Ce qui rend cela plus difficile, c'est que j'ai été incapable de reproduire ce problème sous toutes les conditions contrôlées. Je vous demande donc, pour tous conseils sur la façon dont cela pourrait se produire à partir d'un fichier copier/remplacer opération.

Merci

Mise à JOUR:

J'ai eu un pressentiment et vérifié réseau des journaux d'accès au serveur de fichier chemin d'accès. La suppression du fichier se produit si et seulement si le fichier est utilisé par un utilisateur autre que le créateur, mais pas tout le temps. Encore une fois cependant, il est accessible en lecture seule afin qu'un utilisateur ayant ouvert le fichier ne devrait pas affecter l'écrasement d'une nouvelle version et la plupart du temps ne fonctionne pas. Creuser plus profond, il semble que de temps en temps si et seulement si le fichier est ouvert par un autre utilisateur et que java est d'essayer de remplacer le fichier une AccessDenied Exception est levée, et le fichier est supprimé.

Je crois que ce doit être un bug dans setWritable() ou des Fichiers.copier (ou une combinaison) que le fichier ne doit pas être supprimé, en tout cas, et isWritable() renvoie la valeur vrai à chaque fois. J'ai essayé d'autres méthodes pour configurer/ANNULER le réglage de lecture seule autorisations et se vide. Les travaux en cours autour de ce que j'ai tout simplement intercepte l'exception et les boucles jusqu'à ce que le fichier est supprimé et une nouvelle copie est en place. Cela fonctionne, mais c'est vraiment un hack donc si quelqu'un a des meilleures solutions/suggestions, je leur souhaite la bienvenue.

  • Quelle est la taille de votre fichier? Pourrait-il peut-être causé par un réseau se déconnecter pendant que vous copiez le fichier?
  • Ce fut ma seule théorie de travail, mais j'ai couru à la connectivité réseau des tests sur de longues périodes de temps, sans les abandons
  • Aussi, le fichier sera volumineux, par la suite mais n'est actuellement ~500k
  • Excuse mon ignorance, mais qu'est ce que les Fichiers de classe que vous utilisez?
  • Les fichiers de classe est juste le standard de java 7 nio.fichier.Les fichiers de classe
  • if the file is opened by another user and java is trying to overwrite the file an AccessDenied Exception is thrown. Vous avez les détails d'une telle exception?

InformationsquelleAutor David | 2013-03-08