Frage

Ich habe einige CSV-Dateien, die ich als Teil eines Prüfstandes bin mit. Ich kann sie sie öffnen und lesen, ohne irgendwelche Probleme es sei denn, Ich habe schon die Datei in Excel öffnen, in dem Fall ich eine IOException:

  

System.IO.IOException: Der Prozess kann nicht auf die Datei zugreifen ‚TestData.csv‘, weil sie von einem anderen Prozess verwendet wird

.

Dies ist ein Ausschnitt aus dem Prüfstand:

using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read)), false))
{
    // Process the file
}

Ist dies eine Einschränkung von Stream? Ich kann die Datei in anderen Anwendungen öffnet (Notepad ++ zum Beispiel), so kann es nicht ein O / S Problem sein. Vielleicht brauche ich eine andere Klasse zu benutzen? Wenn jemand weiß, wie ich mich um diese bekommen kann (abgesehen von Schließung excel!) Ich würde sehr dankbar sein.

War es hilfreich?

Lösung

Als Jared sagt, Sie können dies nicht tun, es sei denn, die andere Einheit, die die Datei geöffnet hat für die gemeinsame erlaubt liest. Excel ermöglicht geteilt liest, auch für Dateien hat es zum Schreiben geöffnet. Daher müssen Sie das Öffnen von File mit den FileShare.ReadWrite Parametern.

Der Fileshare param wird oft falsch verstanden. Es zeigt an, was andere Öffner der Datei tun. Es gilt für Vergangenheit und Zukunft Öffner. Denken Sie an Fileshare nicht als rückwirkendes Verbot vor Öffnern (zB Excel), aber eine Einschränkung, die nicht mit der aktuellen öffnen oder Zukunft verletzt werden darf geöffnet.

Im Fall des aktuellen Versuch, eine Datei zu öffnen, sagt FileShare.Read „für mich, diese Datei öffnen nur dann erfolgreich, wenn es keine vorherige Öffner es geöffnet haben nur für Lesen.“ Wenn Sie FileShare.Read auf eine Datei angeben, die für das Schreiben von Excel geöffnet ist, Ihr geöffnet wird fehlschlagen, da es würde die Bedingung verletzt, weil Excel hat es offen zum Schreiben .

Da Excel die Datei zum Schreiben geöffnet hat, müssen Sie die Datei mit FileShare.ReadWrite öffnen, wenn Sie wollen Ihre offen erfolgreich zu sein. Eine weitere Möglichkeit, denken Sie an den Fileshare param: es gibt „den anderen Typ des Dateizugriff“.

Nehmen wir nun an ein anderes Szenario, in dem Sie eine Datei öffnen, die sind derzeit nicht durch eine andere App geöffnet wird. FileShare.Read sagt: „Zukunft Opener die Datei mit Lesezugriff nur öffnen kann“.

Logisch, diese Semantik machen Sinn - FileShare.Read bedeutet, Sie die Datei nicht lesen wollen, wenn der andere Kerl es schon schreibt, und Sie wollen nicht auf die anderen Typen, die Datei zu schreiben, wenn Sie bereits sind es lesen. FileShare.ReadWrite bedeutet, Sie sind bereit, die Datei zu lesen, auch wenn der andere Kerl ist zu schreiben, und Sie haben kein Problem, lassen andere Opener die Datei schreiben, während Sie es lesen.

In keinem Fall tut dies erlaubt mehrere Autoren. Fileshare ist ähnlich einer Datenbank Isolation. Ihre gewünschte Einstellung hängt dabei von der „Konsistenz“ garantieren Sie benötigen.

Beispiel:

using (Stream s = new FileStream(fullFilePath, 
                                 FileMode.Open,
                                 FileAccess.Read,
                                 FileShare.ReadWrite))
{
  ...
}

oder

using (Stream s = System.IO.File.Open(fullFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read, 
                                      FileShare.ReadWrite))
{
}

Nachtrag:

Dokumentation auf System.IO.FileShare ist ein wenig schlank. Wenn Sie die geraden Fakten erhalten möchten, gehen Sie zu in der Dokumentation die Win32-Funktion Create , die das Fileshare-Konzept besser erklärt.

Andere Tipps

Bearbeiten

Ich bin immer noch nicht zu 100% sicher, warum dies die Antwort ist, aber Sie können dieses Problem beheben, indem FileShare.ReadWrite an das Filestream-Konstruktor übergeben.

using (CsvReader csv = new CsvReader(new StreamReader(new FileStream(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)), false)
{
  ...
}

Meine Neugier hat einen Einfluß von mir im Moment, und ich versuche zu verstehen, warum dies die besondere Antwort. Wenn ich es herausfinden, später werde ich dieses Update mit den Informationen.

Die beste Dokumentation erscheint tatsächlich in der Create Funktion. Dies ist die Funktion Net unter der Haube aufrufen, um eine Datei (create-Datei ist ein wenig irreführend) zu öffnen. Es hat eine bessere Dokumentation, wie die gemeinsame Nutzung Aspekt arbeitet, um eine Datei zu öffnen. Eine weitere Möglichkeit ist nur Cheeso Antwort

lesen

Wenn ein anderer Prozess bekommen hat eine Datei öffnen Sie oft File.Copy verwenden können und dann die Kopie öffnen. Keine elegante Lösung, sondern ein pragmatischer.

Ein weiterer Haken ist, dass, wenn Sie einen FileStream mit FileShare.ReadWrite öffnen, nachfolgende dieser Datei öffnet AUCH FileShare.ReadWrite angeben müssen, oder Sie werden die ‚Ein anderer Prozess wird mit dieser Datei‘ Fehler.

die System.Diagnostics Verwendung;

Sie können einfach anrufen Process.Start ( „Dateiname & Pfad“)

Nicht sicher, ob das hilft aber, das ist, was ich habe gerade eine Vorschau PDF-Button in unserem Intranet zu implementieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top