Записать байтовый массив в середину существующего файла в C # .NET - PullRequest
2 голосов
/ 02 марта 2012

Можно ли записать (Добавить - без перезаписи) в существующий двоичный файл.

Мне нужно открыть файл в режиме чтения и записи, а затем случайным образом записать в него байтовые массивы в позиции, указанной вфайл.

Я из Java Background и использую RandomAccessFile в Java для этого, но C # не оставил меня нигде без таких встроенных функций.

Любой другой обходной путь или решение будет высоко ценится.*

-Адил.

Ответы [ 3 ]

8 голосов
/ 02 марта 2012

Можно ли записать (Добавить - без перезаписи) в существующий двоичный файл.

Добавление будет добавлять данные в конце. Все в порядке. Просто найдите конец потока после его открытия в режиме чтения / записи.

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

Кстати, RandomAccessFile также не поддерживает вставку, поэтому возможно, что ваш Java-код тоже не работает.

РЕДАКТИРОВАТЬ: Хорошо, так что если вы хотите просто перезаписать, это легко:

using (var stream = File.Open("file.dat", FileMode.Open))
{
    stream.Position = 100;
    // Assuming data is the data you want to write to the file
    stream.Write(data, 0, data.Length);
}
0 голосов
/ 13 июня 2017

Нет встроенной функции для этого. Если вы ищете файл в определенной позиции (смещении), устанавливая поле позиции потока, а затем записываете новый массив байтов, это заменит существующие байты после этой позиции. Вам нужно сместить существующие байты после смещения на длину вашего предполагаемого байтового массива, а затем записать байтовый массив после смещения. Вот код:

public static void InsertIntoFile(FileStream stream, long offset, byte[] extraBytes)
{
    if(offset < 0 || offset > stream.Length)
    {
        throw new ArgumentOutOfRangeException("Offset is out of range");
    }
    const int maxBufferSize = 1024 * 512;
    int bufferSize = maxBufferSize;
    long temp = stream.Length - offset;
    if(temp <= maxBufferSize)
    {
        bufferSize = (int) temp;
    }
    byte []buffer = new byte[bufferSize];
    long currentPositionToRead = fileStream.Length;
    int numberOfBytesToRead;
    while (true)
    {
        numberOfBytesToRead = bufferSize;
        temp = currentPositionToRead - offset;
        if(temp < bufferSize)
        {
            numberOfBytesToRead = (int) temp;
        }
        currentPositionToRead -= numberOfBytesToRead;
        stream.Position = currentPositionToRead; 
        stream.Read(buffer, 0, numberOfBytesToRead);
        stream.Position = currentPositionToRead + extraBytes.Length;
        stream.Write(buffer, 0, numberOfBytesToRead);
        if(temp <= bufferSize)
        {
            break; 
        }
    }
    stream.Position = offset;
    stream.Write(extraBytes, 0, extraBytes.Length);
}
0 голосов
/ 21 октября 2013

Вот простое и довольно быстрое решение для вставки байтов в середину файла, на тот случай, если кто-то будет искать для вставки данных и найдет этот вопрос.

public void ExpandFile(FileStream stream, long offset, int extraBytes)
{
  // /2902318/failovyi-vvod-vyvod-s-potokami-luchshii-razmer-bufera-pamyati
  const int SIZE = 4096;
  var buffer = new byte[SIZE];
  var length = stream.Length;
  // Expand file
  stream.SetLength(length + extraBytes);
  var pos = length;
  int to_read;
  while (pos > offset)
  {
    to_read = pos - SIZE >= offset ? SIZE : (int)(pos - offset);
    pos -= to_read;
    stream.Position = pos;
    stream.Read(buffer, 0, to_read);
    stream.Position = pos + extraBytes;
    stream.Write(buffer, 0, to_read);
  }

Нужно проверить, хотя ...

...