2016-04-12 6 views
1

私はC#でプロジェクトを進めており、他のアクティビティの処理前に使用中のテキストファイルの最後の行を読み込む必要があります。私のコードサンプルです。File.Openはそれ自身でうまく動作し、ReadLines(パス).Last()も動作します。あなたは、配列の長さを知っているようFile.Open(parametersとFile.Read(path).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

'ReadLines'を使うつもりなら、' File.Open'は必要ありません。 'File.Open'を使いたい場合は' ReadLines'を使わないでください。 – crashmstr

+0

ありがとうございますが、私のプロジェクトにリンクされている別のアプリケーションによってファイルが定期的に書き込まれているため、File.Openを使用しました。メモ帳はオンザフライで開くことができますが、私はそれを使って他のプログラムと一緒にアクセスできます。 – jackie

答えて

1

あなたは、ファイルの行の配列を返しますFile.ReadAllLines方法を、使用することができます。これは、最後の行を取得するために使用することができます

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

この方法では、File.Openを使用する必要はありません。これは、メソッドがファイルを開いて読み込み、閉じてしまうためです。あなたのファイルがメモリに保持されるのに十分小さい場合これはのみ動作します

+0

返事をありがとう。私のファイルは、サイズが数kbにすぎず、他のプログラムが書き込むときに最大で約5kbに達します。これはFile.openを使用した理由です。なぜなら、他のプログラムが定期的にその内容を書き込んでいても、その内容を定期的に読む必要があったからです。私はこれを達成することができますか? – jackie

+0

ファイルが読み込まれた直後に閉じられ、ファイルの内容をこの配列に保存するので、これは役に立ちます。 –

+0

返信いただきありがとうございます。このコードを使用する唯一の問題は、File.Openをアタッチしなくても、実行中の他のアプリケーションがテキストファイルを使用中であると見なすことです。 – jackie

2

問題は、2つの呼び出しの各点である - File.OpenFile.ReadLinesは - 、「フードの下」、独自のファイルシステムリソースを使用し、同じファイルでFile.Readlinesを呼び出す前に、開いているファイル接続を正しく処理していません。

私の提案は、File.Openコールを完全に取り除くことです。必要ではありません(あなたが私たちを表示していない方法で使用している場合を除きます)。 File.Readlinesは、使い捨てパターン全体をラップし、すべてのもの、つまり開いているファイルストリームをクリーンアップします。

あなたあるはあなたが私たちを示していないような方法でFile.Openによって作成されたファイルストリームを使用している場合、このようusingステートメントを使用します。

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(); 

クリーンアップの世話をすることをご例外が発生した場合でもリソースを解放します。

+0

ありがとうございます。コードは私の質問に以前載せたものです。私が示していないものは他にはありません。私はusingステートメントを使用してみましたが、これは皆同じことを示唆しましたが、現在はプロジェクトのデバッグフォルダにSystem.IOが見つからないという例外がスローされます。 – jackie

関連する問題