Подтвердить что ты не робот

Нарушение нарушения на пути Ошибка С#

Вот мой код:

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();

То, что я пытаюсь сделать, - это просто открыть файл с именем log_x.txt и взять "x" из файла file_no.txt. Если файл file_no.txt пуст, введите имя файла журнала log_1.txt и напишите "fileNo + 1" в file_no.txt. После запуска новой программы имя нового файла журнала должно быть log_2.txt. Но я получаю эту ошибку, и я не мог понять, что я делаю неправильно. Спасибо за помощь.

4b9b3361

Ответ 1

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

Ответ 2

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

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