Как записать данные в определенной позиции в C #? - PullRequest
9 голосов
/ 23 ноября 2011

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

Здесь я использовал следующую логику.

using(StreamWriter writer=new StreamWriter(@"D:\"+ FileName + ".txt",true))  
{  
    writer.WriteLine(Encoding.ASCII.GetString(Data),IndexInFile,Data.Length);
}

Но всякий раз, когда я записываю данные в файл, он начинает запись с самого начала.

Мое условие таково: при исходном исходе у меня есть пустой файл и я хочу начать запись в файлс позиции 10000. Пожалуйста, помогите мне. Спасибо заранее.

Ответы [ 4 ]

11 голосов
/ 23 ноября 2011

Никогда не пытайтесь записывать двоичные данные в виде строк, как вы.Это не будет работать правильно.Запишите двоичные данные как двоичные данные.Для этого вы можете использовать Stream вместо StreamWriter.

using (Stream stream = new FileStream(fileName, FileMode.OpenOrCreate))
{
    stream.Seek(1000, SeekOrigin.Begin);
    stream.Write(Data, 0, Data.Length);
}
3 голосов
/ 23 ноября 2011

Вы можете установить позицию внутри потока следующим образом:

writer.BaseStream.Seek( 1000, SeekOrigin.Begin);

Добавьте это перед вашим WriteLine кодом.

Обратите внимание, что я не включил никакого кода, чтобы проверить, что тамдля начала - как минимум 1000 символов внутри файла.

1 голос
/ 23 ноября 2011

Используемая вами перегрузка WriteLine:

Метод TextWriter.WriteLine (Char [], Int32, Int32)

В частности, *Предоставленный аргумент 1008 * на самом деле представляет собой индекс в буфере , с которого начинается чтение , а не индекс в файле, с которого начинается запись - это объясняет, почему вы пишете в началефайл не находится на IndexInFile, как вы ожидаете.

Вы должны получить доступ к базовому потоку и Seek сначала к нужной позиции в файле, а затем записать в файл.

1 голос
/ 23 ноября 2011

Может быть, немного странно, но вы можете получить доступ к свойству BaseStream StreamWriter и использовать Seek(long offset, SeekOrigin origin) для него.(Но имейте в виду, что не каждый поток может использовать Seek.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...