22

これが私のコードです:

public static TextWriter twLog = null;
private int fileNo = 1;
private string line = null;

TextReader tr = new StreamReader("file_no.txt");
TextWriter tw = new StreamWriter("file_no.txt");
line = tr.ReadLine();
if(line != null){
    fileNo = int.Parse(line);
    twLog = new StreamWriter("log_" + line + ".txt");
}else{
    twLog = new StreamWriter("log_" + fileNo.toString() + ".txt");  
}
System.IO.File.WriteAllText("file_no.txt",string.Empty);
tw.WriteLine((fileNo++).ToString());
tr.Close();
tw.Close();
twLog.Close();

次のエラーがスローされます。

IOException: パス C:\Users\Water Simulation\file_no.txt での共有違反

私がしようとしているのは、log_x.txt という名前のファイルを開き、file_no.txt ファイルから「x」を取得することです。file_no.txt ファイルが空の場合、ログ ファイルの名前を log_1.txt にして、「fileNo + 1」と書き込みます新しいプログラムが起動した後、新しいログ ファイル名は log_2.txt である必要があります。しかし、このエラーが発生し、何が間違っているのか理解できませんでした。助けてくれてありがとう。

4

4 に答える 4

23

さて、あなたは別々のストリームを使用してfile_no.txt、読み取り用書き込み用にファイルを開こうとしています。ファイルが読み取りストリームによってロックされるため、これは機能しない可能性があるため、書き込みストリームを作成できず、例外が発生します。

1 つの解決策は、最初にファイルを読み取り、ストリームを閉じてから、fileNo. そうすれば、ファイルは一度に 1 回だけ開かれます。

別の方法は、次のように読み取りと書き込みの両方のアクセス用にファイル ストリームを作成することです。

FileStream fileStream = new FileStream(@"file_no.txt", 
                                       FileMode.OpenOrCreate, 
                                       FileAccess.ReadWrite, 
                                       FileShare.None);

共有読み取りを許可したくないと思いますが、この質問に対する受け入れられた回答にも良い解決策があるようです。

考えられる代替ソリューション
プログラムの起動時に一意のログ ファイルを作成したいということは理解しています。これを行う別の方法は次のとおりです。

int logFileNo = 1;
string fileName = String.Format("log_{0}.txt", logFileNo);

while (File.Exists(fileName))
{
    logFileNo++;
    fileName = String.Format("log_{0}.txt", logFileNo);
}

これにより、ログ ファイルが存在しないファイル番号が見つかるまで番号が増加します。log_1.txt欠点:とがある場合log_5.txt、次のファイルは ではlog_6.txtなくlog_2.txt.

これを克服するには、ディレクトリ内のすべてのファイルをマスクで列挙し、log_*.txt文字列操作を実行して最大数を見つけることができます。

可能性は無限大です:-D

于 2012-07-18T12:26:52.117 に答える