3 Stimmen

Ist es möglich, dass mehrere Prozesse dieselbe Datei lesen?

Ich habe viele Prozesse, die eine Datei lesen, die auf einer Netzwerkfreigabe gespeichert ist. Ursprünglich konnte ich nur einen Prozess die Datei lesen lassen, alle anderen würden Ausnahmen auslösen. Ich habe den folgenden Code implementiert, um das zu beheben:

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
   content = fileStreamReader.ReadToEnd();
}

Dadurch können mehrere Prozesse dieselbe Datei lesen, aber es scheint immer noch Probleme zu geben, denn manchmal können mehrere Prozesse immer noch nicht auf die Datei zugreifen. Dennoch kann ich später, wenn die Datei nicht in Gebrauch ist, zurückgehen und sie problemlos öffnen. Im Moment habe ich einige Wiederholungsversuche mit zufälligen Verzögerungen implementiert, die bisher zu helfen scheinen. Es scheint ein wenig skurril zu mir, um es auf diese Weise zu tun, so was wäre eine bessere Methode sein?

Dies ist der seltsame Teil, die Ausnahme, die ich bekomme, ist nicht von Datei IO überhaupt, es ist von einer Bibliothek namens CommStudio. Kurz gesagt, ich übertrage die Datei in eine Zeichenkette, ändere sie leicht, übertrage sie in einen Speicherstrom und schicke sie über ymodem auf rs232. Die Ausnahme sagt mir, dass das entfernte System abgebrochen hat. Das Gerät, das die Daten erhält, meldet, dass ein Übertragungsfehler aufgetreten ist, was normalerweise bedeutet, dass eine unvollständige/leere Datei empfangen wurde.

Normalerweise würde ich der Bibliothek die Schuld dafür geben, aber beim Testen am Schreibtisch und wenn nur ein Prozess auf die Datei zugreift, funktioniert es einwandfrei. Das einzige, was wirklich konsistent zu sein scheint, ist, dass es wahrscheinlich fehlschlägt, wenn mehrere Prozesse auf eine Datei zugreifen.

2voto

Sean.C Punkte 152

Hatte ein ähnliches Problem, aber nicht viel Zeit, um eine ideale Lösung zu finden. Ich habe einen Webservice erstellt und die Datei lokal an die Webservice-App angehängt. Dann habe ich ein einfaches One-Liner-GET-API erstellt, das über das Büro-Intranet aufgerufen wurde und somit sicherstellte, dass nur die aufrufende Anwendung die Protokolldatei bearbeitete unordentlich, aber funktional.

1voto

Firestrand Punkte 1285

Ich habe in der Vergangenheit ein ähnliches Problem gehabt. Versuchen Sie, die Zugriffsmethode auf die Datei zu ändern.

//Use FileInfo to get around OS locking of the file
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
    //I'm using CopyTo but use whatever method matches your need
    fileInfo.CopyTo(Path.Combine(destination, fileName), false);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X