1. ホーム
  2. c#

[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#

2022-02-13 06:38:03

質問

以下は私のコードです。

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: Sharing violation on path C:\UsersWater Simulationfile_no.txt

私がやろうとしていることは、log_x.txtという名前のファイルを開き、file_no.txtファイルから"x"を取ることです。file_no.txtファイルが空の場合、ログファイルの名前をlog_1.txtとし、file_no txtへ "fileNo + 1" を書き込みます。新しいプログラムが始まると新しいログファイルの名前は log_2.txt でなければなりません。

解決方法を教えてください。

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

一つの解決策は、まずファイルを読み、ストリームを閉じ、そして fileNo . そうすれば、ファイルは一度に一度しか開かれません。

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

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.txtlog_5.txt になると、次のファイルは log_6.txt しかし log_2.txt .

この問題を解決するには、ディレクトリ内のすべてのファイルをマスクで列挙します。 log_*.txt で、文字列操作を行って最大数を求めます。

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