Datei zum Schreiben / Löschen sperren, während jeder Prozess gelesen werden kann

8

Ich entwickle eine Anwendung in C # (.NET) und habe Probleme beim Sperren von Dateien.

  • Meine Hauptanwendung (A) benötigt Lese- / Schreibzugriff auf eine bestimmte Datei.
  • Eine separate Anwendung (B) benötigt Lesezugriff auf die gleiche Datei.
  • Ich muss verhindern, dass der Benutzer die Datei bearbeitet oder löscht, während meine Anwendung (A) läuft. Die Anwendung (A) ist langwierig. Die Datei darf nicht gelöscht werden, solange (A) läuft, auch wenn sie nicht aktiv gelesen oder geschrieben wird.

Ich habe die volle Kontrolle über die Quelle von (A) und (B), also kann ich beide ändern.

Wie kann ich einen Benutzer daran hindern, eine Datei zu ändern / zu löschen, während die Anwendung (A) läuft, während die Anwendung (A) lesen / schreiben und die Anwendung (B) lesen kann?

    
MatthewKing 19.07.2010, 07:13
quelle

4 Antworten

12

Verwenden Sie FileShare.Read , um nur Lesevorgänge von anderen Anwendungen zuzulassen. Sie können die Datei sperren, indem Sie einen Stream öffnen, während die Anwendung A ausgeführt wird. Sie benötigen ein NonClosingStreamWrapper , um zu vermeiden, den Stream zu entsorgen, wenn Sie Ihre StreamWriter entsorgen (dies geschieht automatisch mit using )

NonClosingStreamWrapper von Jon Skeet finden Sie hier p>

Beispiel

Wenn die Anwendung gestartet wird, verwenden Sie dies, um die Datei zu sperren

%Vor%

Wenn Sie in eine Datei schreiben, verwenden Sie

%Vor%

Wenn die Anwendung endet, verwenden Sie diese, um die Datei freizugeben

%Vor%     
Cloudanger 19.07.2010, 07:37
quelle
0

In den meisten Fällen verhindert ein Sperren der Datei nicht, dass der Benutzer die Datei löscht, sondern informiert den Benutzer, der eine andere Instanz der Anwendung ausführt, dass die Datei von einem anderen Benutzer "verwendet" wird. Dies ist besonders nützlich, wenn mehrere Benutzer eine Datei in einen freigegebenen Ordner öffnen. In einem solchen Szenario wäre es viel einfacher, eine "Sperrdatei" zu verwenden, wenn die Datei auf Dateisystemebene gesperrt wird, wenn Appication (A) die Datei öffnet. Daher würde jede andere Anwendung bemerken, dass eine Sperrdatei existiert (Sie können sie mit dem gleichen Dateinamen benennen, aber mit einer anderen Erweiterung), und auch innerhalb der Sperrdatei können Sie schreiben, wer und wann jemand die Sperre erworben hat. Anwendung (B) kann nun auf Benutzer antworten ... "Die Datei scheint von Benutzer xxx von Maschine yyy geändert zu werden, möchten Sie sie wirklich laden?"

Natürlich muss die Anwendung die Sperrdatei entfernen, wenn die Anwendungsdatei nicht mehr verwendet wird oder wenn die Anwendung beendet wird. In dem "unglücklichen" Fall, dass ein Absturz die Sperre des Dateisystems verlässt, kann der Benutzer nur auf die Warnanforderung mit Ja antworten oder kann sie manuell löschen, um die Sperre aufzuheben.

Hoffe, das hilft,

Paolo Marani

    
user2991288 19.06.2015 09:50
quelle
0

Wenn Sie nur die Datei sperren möchten, um das Schreiben oder Löschen zu verhindern, aber Sie möchten die Datei nicht ändern.

Ich speichere eine Zip-Datei, die ich später benutze, damit sie von anderen gelesen werden kann, aber nicht geändert oder geändert werden kann. Wenn ich die Antwort von @Cloudanger verwende, kann ich die ZIP-Datei in anderen Prozessen nicht mehr lesen.

%Vor%     
Michael 21.11.2017 10:46
quelle
-1

obwohl ich es nicht benutzt habe, aber der Name Mutex kann deinen Tag retten. Erstellen Sie vor dem Öffnen einer Datei in Anwendung A einen Mutext wie folgt:

%Vor%

Übergeben Sie den Dateinamen als zweiten Parameter.

Wenn Sie nun eine Datei in Anwendung B öffnen, verwenden Sie Mutex erneut, wenn out Parameter createdNew falsch ist, dann ist die Datei bereits von A geöffnet, so dass Sie sie nur lesen können.

    
TheVillageIdiot 19.07.2010 07:24
quelle

Tags und Links