c # перезапись / сохранение текущего файла - PullRequest
1 голос
/ 03 октября 2011

Я делаю редактор в c #, окна формы. Я хочу сохранить «новое содержимое» файла в том же файле (обычное использование опции «сохранить»), но я получаю IOException, [процесс не может получить доступ к файлу «имя файла», поскольку он используется другим процессом. У меня есть метод, который пишет в новый файл, и он работает. Как использовать его для перезаписи текущего файла.

Edit: Я использую бинарный писатель http://msdn.microsoft.com/en-us/library/atxb4f07.aspx

Ответы [ 3 ]

5 голосов
/ 03 октября 2011

Скорее всего, когда вы загрузили файл, вы не закрыли FileStream или что-то еще, что использовали для его чтения.Всегда используйте оператор using для своих потоков (и других типов, реализующих IDisposable), и это не должно быть проблемой.(Конечно, если у вас на самом деле открыт этот файл в отдельном приложении, это совершенно другая проблема.)

Поэтому вместо:

// Bad code
StreamReader reader = File.OpenText("foo.txt");
string data = reader.ReadToEnd();
// Nothing is closing the reader here! It'll keep an open
// file handle until it happens to be finalized

Вы должны использоватьчто-то вроде:

string data;
using (TextReader reader = File.OpenText("foo.txt"))
{
    data = reader.ReadToEnd();
}
// Use data here - the handle will have been closed for you

Или, в идеале, используйте методы из File, которые делают все это для вас:

string text = File.ReadAllText("foo.txt");
3 голосов
/ 03 октября 2011

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

1 голос
/ 03 октября 2011

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

Все зависит от того, как вы открываете FileStream, см. Здесь: Конструктор FileStream (String, FileMode)

если указать FileMode Создать:

Указывает, что операционная система должна создать новый файл. Если Файл уже существует, он будет перезаписан. Это требует FileIOPermissionAccess.Write. System.IO.FileMode.Create эквивалентен чтобы запросить, что если файл не существует, используйте CreateNew; в противном случае используйте Truncate. Если файл уже существует, но является скрытым В файле создается UnauthorizedAccessException.

...