Le comportement de locking est différent via des partages réseau

J’ai essayé de verrouiller un fichier afin que d’autres services clonés ne puissent pas accéder au fichier. J’ai ensuite lu le fichier, puis déplacez le fichier lorsque vous avez terminé. Le Move est autorisé en utilisant FileShare.Delete .

Cependant, lors de tests ultérieurs, nous avons constaté que cette approche ne fonctionnait pas si nous examinions un partage réseau. J’apprécie que mon approche n’ait pas été la meilleure, mais ma question spécifique est la suivante:

Pourquoi la démonstration ci-dessous fonctionne-t-elle sur le fichier local, mais pas sur le fichier réseau?

Plus vous pouvez être précis, mieux j’ai trouvé que très peu d’informations dans mes recherches indiquent que les partages réseau se comportent différemment des disques locaux.

 ssortingng sourceFile = @"C:\TestFile.txt"; ssortingng localPath = @"C:\MyLocalFolder\TestFile.txt"; ssortingng networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt"; File.WriteAllText(sourceFile, "Test data"); if (!File.Exists(localPath)) File.Copy(sourceFile, localPath); foreach (ssortingng path in new ssortingng[] { localPath, networkPath }) { using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete))) { ssortingng target = path + ".out"; File.Move(path, target); //This is the point of failure, when working with networkPath if (File.Exists(target)) File.Delete(target); } if (!File.Exists(path)) File.Copy(sourceFile, path); } 

EDIT: Cela vaut la peine de mentionner que si vous souhaitez déplacer le fichier d’un partage réseau vers un autre partage réseau lorsque le verrou est en place, cela fonctionne. Le problème semble se produire uniquement lors du déplacement d’un fichier dans le même partage de fichiers lorsqu’il est verrouillé.

Je crois que System.IO.File.Open () correspond à la fonction CreateFile () de l’API Win32. Dans la documentation de Microsoft pour cette fonction [ http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx ], il mentionne les éléments suivants:

Windows Server 2003 et Windows XP / 2000: une violation de partage se produit si vous tentez d’ouvrir un fichier ou un répertoire à supprimer sur un ordinateur distant lorsque la valeur du paramètre dwDesiredAccess est l’indicateur d’access SUPPRIMER (0x00010000) OU autre indicateur d’access, et le fichier ou répertoire distant n’a pas été ouvert avec FILE_SHARE_DELETE. Pour éviter la violation de partage dans ce scénario, ouvrez le fichier ou le répertoire distant avec le droit d’access DELETE uniquement ou appelez DeleteFile sans ouvrir d’abord le fichier ou le répertoire pour suppression.

Selon cela, vous devez passer DELETE comme paramètre FileAccess à IO.File.Open (). Malheureusement, l’énumération DELETE n’a pas été incluse en tant qu’option.

Ce problème concerne uniquement Windows 2003 et les versions antérieures. J’ai testé votre code sur Windows 2008 R2 SP1 et cela fonctionne bien. Il est donc possible que cela fonctionne également sur Windows 2008.