Совместное использование нарушения 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 и взять «x» из файла file_no.txt. Если файл file_no.txt пуст, создайте имя файла журнала log_1.txt и напишите «fileNo + 1» в file_no.txt. После запуска новой программы новое имя файла журнала должно быть log_2.txt. Но я получаю эту ошибку, и я не мог понять, что я делаю неправильно. Спасибо за помощь.


person Ozg    schedule 18.07.2012    source источник
comment
Когда вы говорите, что получаете эту ошибку, было бы ДЕЙСТВИТЕЛЬНО полезно указать реальную ошибку.   -  person Nathan White    schedule 18.07.2012
comment
IOException: нарушение общего доступа по пути C:\Users\Water Simulation\file_no.txt Это ошибка..   -  person Ozg    schedule 18.07.2012
comment
Вы обязательно должны обернуть свои потоки блоками.   -  person Tim Sparkles    schedule 21.01.2017


Ответы (4)


Итак, вы пытаетесь открыть файл 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.txt и log_5.txt, следующий файл будет не log_6.txt, а log_2.txt.

Чтобы преодолеть это, вы можете перечислить все файлы в вашем каталоге с маской log_*.txt и найти наибольшее число, выполнив некоторые манипуляции со строками.

Возможности безграничны :-D

person Thorsten Dittmar    schedule 18.07.2012
comment
Ваше решение намного лучше, спасибо за это! Я недостаточно знаю о IO в С#. Это будет полезно. - person Ozg; 18.07.2012

Что ж, это может быть старым, но принятый ответ мне не помог. Это происходит, когда вы пытаетесь прочитать или записать файл, который вы только что создали из отдельного потока. Решить эту проблему очень просто, просто удалите файловый поток, который вы использовали при его создании, и тогда вы сможете получить свободный доступ к файлу.

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

введите здесь описание изображения

         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, и проблема была исправлена.

person clumsycoder    schedule 17.05.2018
comment
Пожалуйста, не размещайте здесь изображения кодов/исключений. Всегда лучше включать их в виде текста. - person Paul Karam; 17.05.2018

Ни один из предложенных вариантов мне не помог. Но я нашел решение: В моем случае проблема была с Антивирусом, при интенсивной записи в файл Антивирус начал сканирование файла и в этот момент возникла проблема с записью в файл.

person Viktor Surzhko    schedule 22.01.2021