Переименовать файл, открытый самостоятельно - PullRequest
2 голосов
/ 02 июля 2011

Моя программа записывает данные в файл, в то же время пользовательский интерфейс отображает поступающие данные в режиме реального времени.Я хочу, чтобы зарегистрированные данные были на диске в течение одной или двух секунд, если компьютер / программа / ОС / что-либо выключается.Данные поступают как минимум 100 раз в секунду.

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

Контрольный пример:

string fileName1 = "test.txt";
string fileName2 = "test2.txt";

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create)))
{
     sw.WriteLine("before");
     File.Move(fileName1, fileName2);  //<<-- IOException - The process cannot access the file because it is being used by another process.
     w.WriteLine("after");
 }

Итак, Как переименовать файл из процесса, когда тот же процесс имеет поток для открытия файла?

Ответы [ 4 ]

3 голосов
/ 02 июля 2011

Вы должны закрыть первый поток, переименовать файл, а затем снова открыть поток:

using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create)))
{
  sw.WriteLine("before");
  sw.Close();
}

File.Move(fileName1, fileName2);

using (StreamWriter sw = new StreamWriter(new FileStream(fileName2, FileMode.Append)))
{
  sw.WriteLine("after");
}
0 голосов
/ 20 октября 2017

Я знаю, что этот ответ немного запоздал, чтобы помочь вам в вашем проекте переноса, но, возможно, он поможет другим!

Если вы откроете файл с флагом FileShare.Delete, он будетпусть вы переименуете его, хотя он все еще открыт :)

0 голосов
/ 02 июля 2011

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

0 голосов
/ 02 июля 2011

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

Попробуйте FileShare.Write . Вы можете использовать его в File.Open .

using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) 
{
   ...
}
...