Процесс не может получить доступ к файлу, потому что он используется другим процессом.(потоки) - PullRequest
1 голос
/ 12 августа 2010

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

Я использую C #, .Net Framework 3.5 на Windows XP.(Vista и Win7 имеют ту же проблему).

Вот код, который устраняет проблему, где t выдает исключение System.IO.IOException: «Процесс не может получить доступ к файлу» C: \ deleteMe.txt ', поскольку он используется другим процессом. "

public class WriteToFile {

    static void Main(){
        String filename=@"C:\deleteMe.txt";
        String filenameBackup = @"C:\deleteMe (backup).txt";
        String value = "this is a test value";

        //MAKE FILE
        fillFile(filename, value);


        //MAKE A THREAD TO WRITE TO FILE, WHEN READY
        Semaphore readyToWrite=new Semaphore(1, 1);
        var t=new Thread(
            new ThreadStart(delegate(){
                readyToWrite.WaitOne();
                WriteToFile.fillFile(filename, value);
            })
        );
        t.Priority=ThreadPriority.Highest;
        t.Start();


        //BACKUP FILE 
        if (File.Exists(filename)) {
            File.Delete(filenameBackup);
            File.Copy(filename, filenameBackup);
            File.Delete(filename);
        }//endif

        //SIGNAL THREAD TO WRITE TO FILE
        readyToWrite.Release();
    }//method


    public static void fillFile(String filename, String value) {
        try {
            StreamWriter w = File.AppendText(filename);
            using (w) {
                w.Write(value);
                w.Flush();
            }//using
        } catch (Exception e) {
            throw new Exception("Can not write to file", e);
        }//try
    }//method


}//class

Спасибо!

1 Ответ

2 голосов
/ 12 августа 2010

Вы неправильно инициализируете семафор. Попробуйте: new Semaphore(0, 1);

См. эту страницу MSDN .

И WaitEvent, вероятно, проще и более подходит для этой задачи.

2 изменения кода будут:

//Semaphore readyToWrite=new Semaphore(1, 1);
var readyToWrite = new ManualResetEvent(false);

//readyToWrite.Release();
readyToWrite.Set();

Кроме того, установка Приоритета обычно является плохой идеей. Здесь вы ничего не получите (это поток ввода / вывода), поэтому лучше оставьте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...