c # Как получить доступ к файлу, если этот файл обрабатывается другим процессом? - PullRequest
0 голосов
/ 12 декабря 2010
 public static void WriteLine(string text)
    {
        StreamWriter log;

        if (!File.Exists(Filename))
        {
            log = new StreamWriter(Filename);
        }
        else
        {
            log = File.AppendText(Filename);
        }

пока этот метод обрабатывается, другой процесс также вызывает этот метод. Произойдет ошибка «файл был обработан другим процессом». Как решить эту проблему, дождавшись завершения предыдущего процесса.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

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

 public static void WriteLine(string text)
        {
            bool success = false;
            while (!success)
            {

                try
                {
                    using (var fs = new FileStream(Filename, FileMode.Append))
                    {
                        // todo: write to stream here

                        success = true;
                    }
                }
                catch (IOException)
                {
                    int errno = Marshal.GetLastWin32Error();
                    if(errno != 32) // ERROR_SHARING_VIOLATION
                    {
                        // we only want to handle the 
                        // "The process cannot access the file because it is being used by another process"
                        // exception and try again, all other exceptions should not be caught here
                        throw;
                    }

                Thread.Sleep(100);
                }
            }

        }
1 голос
/ 12 декабря 2010

Оба процесса должны создать FileStream , где они задают режим записи FileShare .Затем вы также можете отказаться от проверки, существует ли файл, и просто использовать метод добавления файла.

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