La différence entre Fichier.Remplacer et (Fichier.Supprimer+Fichier.Déplacer) en C#
Aujourd'hui, j'ai couru dans un problème étrange: Depuis plus d'un an et plusieurs versions /les tests de l'application, le code suivant a été utilisé avec succès pour remplacer un fichier par un autre.
File.Replace(path + ".tmp", path, null);
Ce a travaillé localement et aussi les chemins d'accès UNC (réseau d'actions). Mais aujourd'hui j'ai eu l'erreur suivante lorsque j'ai utilisé ce code pour remplacer un fichier sur un chemin d'accès UNC (local fonctionne toujours):
Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus
Lorsque j'utilise le code suivant à la place de ce qui précède, il fonctionne:
File.Delete(path);
File.Move(path + ".tmp", path);
Donc mes questions:
- Quelle est la différence entre les deux fragments de code?
- Pourrait-il que Microsoft ont changé la façon de Fichier.Remplacer " fonctionne?
Je suis en utilisant .Net Framework 4.0 avec Visual Studio 2010.
Merci d'avance.
- Vous n'avez pas arriver à avoir un de ces super-désireux de sécurité des outils en cours d'exécution sur le serveur, le désordre de leur "sur la protection d'accès" ou quelque chose, non? Est-ce possible avec tous les serveurs? Il l'a fait arrêter de travailler à une date précise, et - ce qui s'est passé sur le serveur à ce point dans le temps?
- merci pour votre réponse: nous n'avons pas un spécial "über" outil de sécurité et n'ont pas changé l'infrastructure depuis un certain temps. Le problème apparaît également sur d'autres machines dans d'autres réseaux. Je ne sais pas la date exactement, mais je dirais avant février 2011, il a travaillé...
File.Replace
demandes de lecture et d'écriture de l'autorisation sur à la fois la source et la destination, alors p/invoqueReplaceFile
. Vérifiez les docs surReplaceFile
pour trouver des indices. msdn.microsoft.com/en-us/library/aa365512.aspx- Nous ne pouvons que deviner, il doit travailler. Comme Tergiver dit, la méthode n'a rien fait de spécial. Et vous êtes sûr que votre code (qui, je suppose, écrit *.tmp), à la fermeture de fichier? Car, encore une fois, comme Tergiver dit, la lecture et l'écriture pour les deux fichiers sont demandés. D'abord. Avant que quelque chose se passe dans cette méthode. Manque un Jeter peut-être pour votre écrivain? Ce que j'essaie de dire, c'est: Ne vous focalisez pas trop sur le fichier cible. Les deux pourrait être le problème (à moins que l'erreur se réfère explicitement à la cible).
- J'ai vérifié l'élimination/la fermeture de tous mes autres actions sur les fichiers et pas - il n'ya pas de manque de disposer/fermer...
Vous devez vous connecter pour publier un commentaire.
Selon MSDN sur Fichier.Remplacer
Fichier.Remplacer lève une exception lors de...
Qui Fichier.Supprimer Le Fichier.Déplacement n'.
Replace
est de remplacer le fichier. Lors de l'utilisation de Déplacement + Supprimer, il vous suffit de créer un nouveau fichier. Remplacer conserve les attributs de sécurité, d'autres flux de données, d'identification de fichier, le cryptage, la compression, la date de création etc. Notez que la seule raison queFile.Move
œuvres à travers des volumes est qu'il spécifiquement implémente cette fonctionnalité par retomber Copie+Suppr - le sous-jacent winapi MoveFile n'autorise pas le déplacement de fichiers entre les volumes, pour des raisons évidentes (le déplacement d'un fichier sur un volume est un acte de la modification du chemin d'accès au fichier, il n'y a pas de reproduction).Voici la Article MSDN sur
File.Replace()
Création d'une sauvegarde de l'original semble être la différence.
}