Обработка steamwriter после неудачного восстановления сети - PullRequest
0 голосов
/ 19 марта 2012

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

Проблема в том, что при восстановлении сети я ничего не могу сделать с StreamWriter. При вызове Flush(), Close() или Dispose() выдается IOException «Указанное имя сети больше не доступно». Мой код выглядит так:

int charsToRead = 100;
while(!inputFileStream.EndOfStream)
{
    char[] block = new char[charsToRead];
    int charsRead = inputFileStream.ReadBlock(block, 0, charsToRead);
    outputFileStream.Write(new string(block, 0, charsRead));
    outputFileStream.Flush();
}

Каков наилучший способ продолжить работу с StreamWriter после восстановления после сбоя сети? Спасибо.

Обновление: я работаю с текстовыми файлами.

1 Ответ

0 голосов
/ 19 марта 2012

Как выглядит файл назначения после того, как сетевое соединение обрывается во время записи в него?Это важно знать, так как ваша стратегия восстановления обязательно зависит от этого.

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

Однако, если файл назначения успешно записан даже в случае сбоя сети, вы можете использоватьFile.Append() для повторного открытия файла и продолжения процесса копирования.Затем вы должны использовать inputFile.Position = outputFile.Position, чтобы чтение и запись снова синхронизировались.

Если сетевое подключение к файлу input не удается (то, из которого вы читаете), простоповторно откройте его с помощью File.Open() и снова установите inputFile.Position = outputFile.Position.

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

...