2016-10-30 6 views
1

Ich speichere Dateien in einer SQL Server-Datenbank und zeige auch die Dateien in meiner Anwendung an, wenn ein Benutzer sie auswählt. das ist, was ich getan habe:Der Prozess kann nicht auf die Datei JJJJ zugreifen, da er von einem anderen Prozess verwendet wird.

LetterBAL letterBal = new LetterBAL(); 
string filter = "Id=" + letterListView.SelectedItems[0].Text; 

Letter letter = letterBal.GetLetterImage(filter);   

string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
path = path + "\\IssuedLetter\\" +letter.Id.ToString() + "." +letter.FileExt;     

webBrowser1.Navigate(path); 


public Letter GetLetterImage(string filter) 
{ 
     LetterDB letterDB = new LetterDB(); 
     Letter letter = letterDB.GetLetterImage(filter); 

     string path = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     path = path + "\\IssuedLetter"; 
     path = path + "\\" + letter.Id.ToString() + "." + letter.FileExt;    

     using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write)) 
     fs.Write(letter.ltr_Image, 0, letter.ltr_Image.Length);   
     return letter; 
} 

Das erste Mal, dass Benutzer eine Datei auswählen, ist es problemlos in Web-Browser dargestellt. Aber wenn für die zweite Zeit (wenn der Web-Browser nach wie vor die gleiche PDF-Datei angezeigt wird) es sagt

Der Prozess kann nicht auf die Datei zugreifen ‚C: \ Benutzer \ mj.PG \ Dokumente \ IssuedLetter \ 3.pdf‘ weil es von einem anderen Prozess verwendet wird.

Wie kann ich mit der Situation umgehen, wenn der Benutzer erneut auf dieselbe Datei klickt, um sie anzuzeigen?

+0

Überprüfen Sie, ob die Datei existiert, bevor Sie darauf schreiben? Oder schreiben Sie die Dateien dort, wie sie zur Datenbank hinzugefügt werden, anstatt wenn sie angezeigt werden – Rob

+0

Ich möchte Benutzer in der Lage sein, die Datei zu überschreiben (vielleicht hat er etwas daran geändert) – nnmmss

+0

Ja, aber Ihr Code ist nicht das machen. Das nächste Mal, wenn jemand es anschaut, wird es von "GetLetterImage" überschrieben. Handle persistent to disk, wenn ein Benutzer die Datei hinzufügt oder bearbeitet, nicht beim Lesen. – Rob

Antwort

1

Es gibt mehrere Möglichkeiten, ein Blockieren zu vermeiden:

  1. Sie keine Zwischendateien verwenden überhaupt, verwenden DocumentStream Eigentum von WebBrowser und Memory als Quelle.
  2. Verwenden Sie einen neuen temporären Dateinamen für jeden Buchstaben. Vergessen Sie nicht die Aufräumprozedur beim Schließen der Anwendung.
  3. Am flexibelsten und zeitaufwendigsten ist es, einen kleinen HTTP-Server in Ihre Anwendung einzubetten, zum Beispiel basierend auf OWIN self-hosting Komponenten. So können Sie zusätzlich moderne HTML-basierte Benutzeroberflächen mit Authentifizierung, Autorisierung und anderen Funktionen erstellen. Als Bonus kann Ihre Anwendung von anderen Computern im lokalen Netzwerk aus zugänglich sein und den Windows-Dienst einfach implementieren, wenn Sie möchten.
Verwandte Themen