web-dev-qa-db-ja.com

ファイルC#の読み取りおよび書き込み中の共有違反IOException

ここに私のコードがあります:

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である必要がありますが、このエラーが表示され、何が間違っているのか理解できませんでした。

19
Ozg

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

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.txtlog_5.txtがある場合、次のファイルはlog_6.txtではなくlog_2.txtになります。

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

可能性は無限です:-D

21

まあ、これは古いかもしれませんが、受け入れられた答えは私にとってはうまくいきませんでした。これは、別のストリームから作成したファイルを読み書きしようとしたときに発生します。これを解決するのは非常に簡単です。作成に使用したファイルストリームを破棄するだけで、ファイルに自由にアクセスできます。

if (!File.Exists(myfile))
{
    var fs = new FileStream(fav, FileMode.Create);
    fs.Dispose();
    string text = File.ReadAllText(myfile);
}
1
Prince Tegaton

ここに画像の説明を入力

         var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create);

        resizedBitmap.Compress(Bitmap.CompressFormat.Png, 200, stream); //problem here
        stream.Close();
        return resizedBitmap;

Compressメソッドでは、品質パラメーターの値を200として渡していましたが、残念ながら0〜100の範囲外の値は許可されません。

品質の値を100に戻し、問題が修正されました。

0
clumsycoder