Совместное нарушение IOException при чтении и записи в файл C#

Вот мой код:

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

5 ответов

Решение

Ну, вы пытаетесь открыть файл 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

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

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

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

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

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

Установите для параметра FileShare значение ReadWrite.

      FileStream fileStream = new FileStream(fullName,
                                         FileMode.OpenOrCreate,
                                         FileAccess.ReadWrite,
                                          FileShare.ReadWrite);

        string path = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName; // return the application.exe current folder
  string fullName = Path.Combine(path, "BarData.json"); 
           
    
            if (!File.Exists(fullName)) 
            {
              //create filestream
              FileStream fileStream = new FileStream(fullName,
                                             FileMode.OpenOrCreate,
                                             FileAccess.ReadWrite,
                                              FileShare.ReadWrite);
    

    
              await JsonSerializer.SerializeAsync(fileStream, barChartData);
              fileStream.Dispose();//async
            }
    
            string filedata = File.ReadAllText(fullName);
Другие вопросы по тегам