Ошибка Процесс не может получить доступ к файлу,

475
26 мая 2017, 11:23

Ошибка Процесс не может получить доступ к файлу, т.к. этот файл используется другим процессом. Что мне нужно, разработать класс файл, предусмотреть возможность добавления в его конец. Собственно это код с Form.

     if (match.Success)
                ;
            else
                throw new IOException(" Неверный формат имени файла.");
            File file1 = new File(file_Name, text);
            file1.Add(file_Name, text);          
            file1.get_Info(textBox1);
            ...
            catch (Exception ex)// 
            тут ошибка, если обработку оставить 

Теперь класс File

  public File (string f_Name, string info)
        if (f_Name != null && info != null)
            if (System.IO.File.Exists(f_Name))
                FileInfo exist_File = new FileInfo(f_Name);
                //Заполняем поля
            else
                System.IO.File.Create(f_Name);
                FileInfo create_File = new FileInfo(f_Name);
                //Заполняем поля

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

        public void Add(string f_name,string new_text)
    {
        ошибка тут, если без try ... catch
        using (StreamWriter f_Stream = new StreamWriter(f_name, true, System.Text.Encoding.Default))
        {
            byte[] array = System.Text.Encoding.Default.GetBytes(new_text);
            //int temp_Length = Convert.ToInt32(Length);
            //Length += array.Length;
            f_Stream.Write(new_text);
            Information += Environment.NewLine + new_text;

Что не так: 1) Если файл с таким именем не создан, возникает ошибка(смотри шапку), но файл создаётся, добавление в него возможно(с другого button'a). 2) Если файл уже имеется, то всё хорошо, мы добавляем строку в конец файла и выводим информацию по нему.

В чём косяк?

Answer 1

В одном месте кода у вас вызывается

System.IO.File.Create(f_Name);

— этот метод создаёт файл, открывает его и возвращает файловый поток FileStream. Пока этот поток не закрыт - файл занят.

В другом месте кода у вас используется

new StreamWriter(f_name, ...);

— попытка открыть и использовать тот же файл, судя по всему. Естественно, это приводит к ошибке.

Что можно сделать?

  1. Закрывать поток сразу после создания файла:

    System.IO.File.Create(f_Name).Close();

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

  2. Сохранять ссылку на созданный файловый поток и далее использовать её вместо имени файла:

    // Поле класса
    FileStream fileStream;

    Обратите внимание: это именно поле класса, не локальная переменная.

    // Сохраняем ссылку на файловый поток
    fileStream = System.IO.File.Create(f_Name);

    В другом месте (методе) кода:

    // Используем поток вместо строкового имени файла
    new StreamWriter(fileStream);

    Это должно работать.

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

  3. Вместо System.IO.File.Create использовать конструктор

    new FileStream(...);

    У него целых 15 перегрузок со множеством всевозможных параметров: FileMode, FileAccess и другие. Нас сейчас интересует FileShare.

    При создании файлового потока можно указать, разрешаем ли мы доступ другим процессам к нему:

    new FileStream(f_Name, FileMode.Create, FileAccess.Write, FileShare.Write);

    Тут мы указали, что создаём (Create) новый файл, получаем к нему доступ (Write) на чтение и разрешаем - Share - другим процессам писать (Write) в него.

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

    using (var fs = new FileStream(f_Name, FileMode.Open, FileAccess.Write, FileShare.Write))
    using (var sw = new StreamWriter(fs))
    {
    }

    Тут мы открываем (Open) поток с доступом на запись и разрешением на запись (Write). Таким образом, в системе может быть несколько указателей на открытый файл, но у них у всех должны быть одинаковые параметры на доступ.

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

    Хотя, конечно, второй способ - с хранением ссылки на открытый файл - правильнее.

READ ALSO
Событие Form.Closing и Form.Closed

Событие Form.Closing и Form.Closed

Мне кажется, событие FormClosing можно использовать лишь в некоторых ограниченных ситуациях, таких как, например, запрос на подтверждение закрытия...

226
Работа Split C#

Работа Split C#

У меня есть строка "140-hp, 31-liter V-6 (regular gas),\r\n170-hp, 5

278
Антивирусник ругается на программу

Антивирусник ругается на программу

Пишу простой почтовый месседжер с возможностью отложенной отправкиОднако когда наступает момент отправлять письмо по адресу антивирус...

261
C# использование функции kernel32 CreateProcess

C# использование функции kernel32 CreateProcess

Есть две программы, написанные на с#Обе - консольные приложения, в каждой создается форма (System

563