Ошибка Процесс не может получить доступ к файлу, т.к. этот файл используется другим процессом. Что мне нужно, разработать класс файл, предусмотреть возможность добавления в его конец. Собственно это код с 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) Если файл уже имеется, то всё хорошо, мы добавляем строку в конец файла и выводим информацию по нему.
В чём косяк?
В одном месте кода у вас вызывается
System.IO.File.Create(f_Name);
— этот метод создаёт файл, открывает его и возвращает файловый поток FileStream
. Пока этот поток не закрыт - файл занят.
В другом месте кода у вас используется
new StreamWriter(f_name, ...);
— попытка открыть и использовать тот же файл, судя по всему. Естественно, это приводит к ошибке.
Что можно сделать?
Закрывать поток сразу после создания файла:
System.IO.File.Create(f_Name).Close();
Решение рабочее, хотя и странное: зачем открывать файл и тут же его закрывать.
Сохранять ссылку на созданный файловый поток и далее использовать её вместо имени файла:
// Поле класса
FileStream fileStream;
Обратите внимание: это именно поле класса, не локальная переменная.
// Сохраняем ссылку на файловый поток
fileStream = System.IO.File.Create(f_Name);
В другом месте (методе) кода:
// Используем поток вместо строкового имени файла
new StreamWriter(fileStream);
Это должно работать.
Важно: при таком подходе обязательно реализуйте в своём классе интерфейс IDisposable
, в Dispose
методе которого обязательно должен закрываться этот файловый поток.
Вместо 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
). Таким образом, в системе может быть несколько указателей на открытый файл, но у них у всех должны быть одинаковые параметры на доступ.
При этом открыть его на чтение не получится, т. к. изначально это было не разрешено. Поэтому выбирайте нужное вам сочетание параметров.
Хотя, конечно, второй способ - с хранением ссылки на открытый файл - правильнее.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне кажется, событие FormClosing можно использовать лишь в некоторых ограниченных ситуациях, таких как, например, запрос на подтверждение закрытия...
Пишу простой почтовый месседжер с возможностью отложенной отправкиОднако когда наступает момент отправлять письмо по адресу антивирус...
Есть две программы, написанные на с#Обе - консольные приложения, в каждой создается форма (System