невозможно перезаписать файл с помощью Streamwriter, несмотря на append = false, без закрытия файла

используя C # VS 2010, формы Windows. Моя цель - открыть и закрыть файл только один раз и «перезаписать» его несколько раз. Я никогда не хочу добавлять. Причина для открытия и закрытия файла один раз в том, что я хочу, чтобы операция записи была самой быстрой.

Я передаю append = false в конструктор streamwriter, но он все еще добавляется, а не перезаписывается.

private void testSpeed()
{
StreamWriter sw1 = new StreamWriter(@"d:\logfolder\overwrite.txt", false);
            sw1.AutoFlush = true;
            for (int i = 0; i < 5000; i++)
            {               
                    sw1.Write(i);            
            }
            sw1.Close();
}

Мой ожидаемый результат - файл должен иметь только 4999, но вместо этого я получаю это 0123456789101112131415161718192021222324252627282930313233 ............... вплоть до 4999

этот файл уже существует d: \ logfolder \ overwrite.txt

Есть идеи, что я делаю неправильно?


person bsobaid    schedule 02.03.2015    source источник
comment
Почему вы не используете объект FileStream?   -  person ArtK    schedule 02.03.2015
comment
Я пробовал это, но не помогло. FileStream sw1 = новый FileStream (@d: \ logfolder \ overwrite.txt, FileMode.OpenOrCreate, FileAccess.Write); а затем внутри цикла sw1.Write (uniEncoding.GetBytes (s), 0, uniEncoding.GetByteCount (s)); он все еще добавляется   -  person bsobaid    schedule 02.03.2015
comment
Я отредактировал ваше название. См. Должны ли вопросы включать «теги» в свои заголовки?, где нет единого мнения, не следует.   -  person John Saunders    schedule 02.03.2015
comment
На этот вопрос есть ваш ответ, и он, вероятно, является дубликатом stackoverflow.com/questions/2313728/reusing-a-filestream   -  person Steve Mitcham    schedule 02.03.2015
comment
поэтому do_fstrea.SetLength (0) перед каждой записью выполняет перезапись, но это очень медленно. На выполнение цикла 50 000 раз ушло 35 секунд. Пример, который у меня есть в моем исходном сообщении, составляет менее 1 секунды, но он добавляется, а не перезаписывается. Так что моя проблема остается нерешенной.   -  person bsobaid    schedule 02.03.2015


Ответы (2)


Параметр append = false подходит только для единственной общей записи, которую выполняет поток. Каждый вызов stream.Write() добавляет данные к тому, что уже есть в потоке.

Вам нужно будет либо Flush(), либо Clear() поток во время каждой итерации, хотя, скорее всего, это не сработает.

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

ИЗМЕНИТЬ

Наличие sw1.autoflush = true означает только то, что он немедленно запишет контекст в метод Write() в файл, вместо того, чтобы ждать, пока соединение не будет закрыто.

Если вы хотите записать только последний элемент в своей коллекции, вы можете просто сделать следующее:

for (int i = 0; i < 5000; i++)
{
    if (i == 4999)
    {
        sw1.Write(i);
    }
}

Однако, если вы работаете со списком или массивом элементов, вы можете просто сделать что-то вроде следующего:

List<int> nums = new List<int>();

// Note that this requires the inclusion of the System.Linq namespace.
sw1.Write(nums.Last());
person krillgar    schedule 02.03.2015
comment
autoflush = истина. Нет clear (), и я также пробовал sw1.flush () внутри цикла, но это не сработало, и я получил те же результаты. Как узнать, сколько времени ждать до завершения последней записи? - person bsobaid; 02.03.2015
comment
Автозапуск ничего не говорит о прослушивании параметра append в StreamWriter. Как я уже сказал, эти два метода, скорее всего, не сработают (а одного не существует). Вы спросили, что вы делаете не так, я объяснил, что не так в вашем подходе. Как дождаться последнего элемента, который нужно написать, зависит от вас, поскольку я сомневаюсь, что ваш конкретный вариант использования так же конкретен, как ваш пример. - person krillgar; 02.03.2015
comment
хорошо, тогда как добиться того, чего я хочу добиться, т.е. перезаписать содержимое, не открывая и не закрывая средство записи потока? - person bsobaid; 02.03.2015

Вам нужно использовать

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);

person Jorge Freitas    schedule 11.10.2016