2010-04-23 20 views
5

Ich habe versucht, eine Datei zu sperren, damit andere geklonte Dienste nicht auf die Datei zugreifen können. Ich lese dann die Datei und verschiebe dann die Datei, wenn sie fertig ist. Die Verschiebung ist zulässig, indem FileShare.Delete verwendet wird.Sperrverhalten unterscheidet sich über Netzwerkfreigaben

In späteren Tests fanden wir jedoch, dass dieser Ansatz nicht funktioniert, wenn wir eine Netzwerkfreigabe betrachten. Ich schätze, mein Ansatz war vielleicht nicht der beste, aber meine spezifische Frage lautet:

Warum funktioniert die folgende Demo gegen die lokale Datei, aber nicht gegen die Netzwerkdatei?

Je genauer Sie sein können, desto besser, da ich in meinen Suchen nur sehr wenige Informationen gefunden habe, die darauf hinweisen, dass sich Netzwerkfreigaben anders verhalten als lokale Festplatten.

string sourceFile = @"C:\TestFile.txt"; 
string localPath = @"C:\MyLocalFolder\TestFile.txt"; 
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt"; 

File.WriteAllText(sourceFile, "Test data"); 

if (!File.Exists(localPath)) 
    File.Copy(sourceFile, localPath); 

foreach (string path in new string[] { localPath, networkPath }) 
{ 
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete))) 
    { 
     string 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: Es lohnt sich zu erwähnen, dass, wenn Sie die Datei von einem Netzwerkfreigabe verschieben wollen Aktie zu einem anderen Netzwerk, während das Schloss an seinem Platz ist, das funktioniert. Das Problem tritt nur auf, wenn Sie eine Datei innerhalb von derselben Dateifreigabe verschieben, während sie gesperrt ist.

+0

Überprüfen Sie, ob Sie über Berechtigungen zum Schreiben in einem freigegebenen Ordner verfügen. – Nayan

+0

Berechtigungen wurden überprüft und sind in Ordnung. Aktiver Benutzer hat Vollzugriff auf Verzeichnis und Freigabe – MattH

+0

Welche Art von Betriebssystem bietet die Freigabe? –

Antwort

3

Ich glaube, dass System.IO.File.Open() auf die Win32-API-Funktion CreateFile() zugeordnet ist. In der Dokumentation von Microsoft für diese Funktion [http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx], erwähnt sie folgenden:

Windows Server 2003 und Windows XP/2000: Eine Zugriffsverletzung tritt auf, wenn versucht wird, auf einem Remote eine Datei oder ein Verzeichnis für das Löschen zu öffnen Computer, wenn der Wert des DwDesiredAccess-Parameters das DELETE-Zugriffsflag (0x00010000) OR mit einem anderen Zugriffsflag ist und die Remote-Datei oder das Remote-Verzeichnis nicht mit FILE_SHARE_DELETE geöffnet wurde. Um die Freigabeverletzung in diesem Szenario zu vermeiden, öffnen Sie die Remote-Datei oder das Remote-Verzeichnis nur mit dem Zugriffsrecht DELETE oder rufen Sie DeleteFile auf, ohne zuvor die Datei oder das Verzeichnis zum Löschen geöffnet zu haben.

Dementsprechend müssten Sie DELETE als FileAccess-Parameter an IO.File.Open() übergeben. Leider war die Enumeration DELETE nicht als Option enthalten.

Dieses Problem betrifft nur Windows 2003 und früher. Ich habe Ihren Code unter Windows 2008 R2 SP1 getestet und es funktioniert einwandfrei. Es ist also möglich, dass es auch unter Windows 2008 funktioniert.

+0

Danke Brian. Dies scheint eine gültige Zusammenfassung zu sein und erklärt, was ich gesehen habe. – MattH

Verwandte Themen