2011-07-02 14 views
1

私のプログラムはデータをファイルにロギングしていると同時に、ユーザーインターフェイスに着信データを表示します。私は、ログされたデータが、コンピュータ/プログラム/ OS /その他がシャットダウンされた場合、2〜2秒以内にディスクに保存されることを望みます。データは少なくとも100回/秒で到着しています。ファイル名を自分で開く名前を変更

ロギングがアクティブな間にユーザーがログファイルに新しい名前を付けることができるようにします。問題は、同じプロセスであっても、開いている間はファイルの名前を変更できないということです。

テストケース:

string fileName1 = "test.txt"; 
string fileName2 = "test2.txt"; 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    File.Move(fileName1, fileName2); //<<-- IOException - The process cannot access the file because it is being used by another process. 
    w.WriteLine("after"); 
} 

を同じプロセスがオープンしたファイルへのストリームを持っている間ので、はどのように私は、プロセスからのファイルの名前を変更できますか?

+0

であっても、あなたが本当にHTTP(log4netのように、ロギングライブラリを試してみてください、あなたがそれを名前を変更できるようになります://logging.apache.org/log4net/)。 –

+1

残念ながら、ファイルを移動したり、名前を変更したり、ストリームを使用しているときにファイルを削除したりすることはできません。別のプログラムが使用している場合と同じです... –

答えて

2

あなたは、最初のストリームを閉じ、ファイルの名前を変更し、ストリームを再度開く必要があります。

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create))) 
{ 
    sw.WriteLine("before"); 
    sw.Close(); 
} 

File.Move(fileName1, fileName2); 

using (StreamWriter sw = new StreamWriter(new FileStream(fileName2, FileMode.Append))) 
{ 
    sw.WriteLine("after"); 
} 
+0

これは動作しません。使用ブロックにある間に 'sw'を設定してください。エラー: ''変数を使用しているため 'sw'に割り当てることができません。 –

+0

合理的に聞こえます。しかし、2度目のfilename2を意味する必要があり、filemodeを正しく作成することはできません。長い間私はギャップの間に任意のストリームを私はこれが動作すると思いますがない間に任意のログをロックします。 – obmoc

+0

良い点。私は私の答えを更新しました。 –

0

それはプロセスで開いている間は、ファイルの名前を変更することはできませんが、に書き込みたい場合はそれはあなたのプログラムの他のインスタンスから、これを行います。

Try FileShare.WriteFile.Openで使用できます。ファイル1秒間に100回を閉じエン

using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) 
{ 
    ... 
} 
0

オープニングでは、一時ファイルにログインして、すべての10秒程度の一時ファイルを追加することができ、あなたのパフォーマンスに影響を与えます。それはあなたが望むものをあなたに与えるでしょう。

+0

ファイルは、プログラムが実行されている間は開いています。名前の変更は、ユーザーが1回または2回行うだけです。 – obmoc

+0

ファイルの名前を変更する場合は、ファイルを開いてはいけません。したがって、ログエントリを追加するために10秒に1回だけ開くと、ユーザーはプログラムの実行中にファイルの名前を変更できます。 – Peter

0

私はこの回答があなたの移植プロジェクトであなたを助けるのに少し遅れていることを知っていますが、おそらく他人を助けるでしょう!あなたはFileShare.Deleteフラグでファイルを開いた場合

それはあなたがその多くのデータをロギングしている場合、それはまだ開い:)

関連する問題