2016-04-12 12 views
1

Ich arbeite an einem Projekt in C# und muss in der Lage sein, die letzte Zeile einer Textdatei zu lesen, bevor sie für andere Aktivitäten verarbeitet Hier ist mein Codebeispiel Das File.Open funktioniert gut von selbst und auch die ReadLines (Pfad) .Last(). Zusammen funktionieren sie nicht. Ich bin neu in C# und würde jede mögliche Hilfe schätzen. Dankemit File.Open (Parameter und File.Read (Pfad) .Last()

string g = "C:\\zebra\\file.txt"; 

File.Open (g, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);          

string file_name = File.ReadLines(g).Last();// error of being unable to access file because it's in use 

      Thread.Sleep(50); 

      Name.Text = file_name.Substring(13); 
      ID.Text = file_name.Substring(8, 5); 
+2

Wenn Sie 'ReadLines' verwenden, müssen Sie' File.Open' nicht verwenden, wenn Sie 'File.Open' verwenden möchten, verwenden Sie' ReadLines' nicht. – crashmstr

+0

Danke, aber ich habe die Datei.Open verwendet, weil die Datei regelmäßig von einer anderen Anwendung geschrieben wird, die mit meinem Projekt verknüpft ist. Obwohl Notepad in der Lage ist, im laufenden Betrieb zu öffnen, benutzte ich das, so dass ich es neben dem anderen Programm zugreifen konnte. – jackie

Antwort

1

Sie können die File.ReadAllLines Methode verwenden, die eine Anordnung der Zeilen der Datei angezeigt werden können. Dies kann die letzte Zeile zu bekommen verwendet werden, da die Länge des Arrays kennen

string[] lines = File.ReadAllLines(g); 
string file_name = lines[lines.GetUpperBound(0)]; 

Dies vermeidet die Notwendigkeit, File.Open überhaupt zu verwenden, wie die Methode öffnet, liest und schließt die Datei in einem. Dies funktioniert nur, wenn die Dateien klein genug sind,

+0

Danke für die Antwort. Meine Datei ist nur ein paar kb groß und erreicht maximal 5kb, wenn das andere Programm darauf schreibt. Aus diesem Grund habe ich File.open benutzt, weil ich den Inhalt regelmäßig lesen musste, auch wenn das andere Programm auch periodisch darauf schreibt. Kann ich das irgendwie erreichen? – jackie

+0

Das wird gut dafür sein, da die Datei sofort nach dem Lesen geschlossen wird und den Inhalt der Datei in diesem Array immer noch speichert –

+0

Danke für die Antwort. Das einzige Problem bei der Verwendung des Codes besteht darin, dass die Textdatei weiterhin von der anderen laufenden Anwendung verwendet wird, ohne dass File.Open angehängt ist. – jackie

2
im Speicher gehalten werden

Das Problem ist, dass jeder der beiden Anrufe - File.Open und File.ReadLines - verwendet ein eigenes Dateisystemressource „unter der Haube“, und Bevor Sie in derselben Datei File.Readlines aufrufen, wird die geöffnete Dateiverbindung nicht ordnungsgemäß entfernt.

Mein Vorschlag ist, den Anruf File.Open vollständig loszuwerden, es wird nicht benötigt (es sei denn, Sie verwenden es in irgendeiner Weise, die Sie uns nicht gezeigt haben). File.Readlines wickelt das gesamte Wegwerfmuster ein und kümmert sich darum, alles für Sie aufzuräumen, d. H. Den offenen Dateistrom.

Wenn Sie sind die Datei-Stream von File.Open in einer Art und Weise erstellt, dass Sie uns nicht gezeigt haben, dann eine using Anweisung wie folgt verwendet werden:

using (FileStream file = File.Open(g, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    // do your stuff here with your `file` object. 
} 

// Now do your subsequent/unrelated operations on the file: 

string file_name = File.ReadLines(g).Last(); 

Das wird zur Reinigung kümmern Ihre Ressourcen, selbst wenn eine Ausnahme auftritt.

+0

Danke. Der Code ist, was ich früher in meiner Frage aufstellte. Es gibt nichts anderes, was ich nicht gezeigt habe. Ich habe versucht, die using-Anweisung zu verwenden, die Sie vorgeschlagen haben, und jetzt löst es eine Ausnahme aus, ein System.IO in dem Debug-Ordner des Projekts nicht zu finden. – jackie

Verwandte Themen