将字节数组写入C#.NET中现有文件的中间

将字节数组写入C#.NET中现有文件的中间,c#,file,random,bytearray,byte,C#,File,Random,Bytearray,Byte,是否可以写入(追加-不覆盖)现有的二进制文件 我必须以读写模式打开一个文件,然后在文件中指定的位置随机写入字节数组 我来自Java背景,我使用Java中的RandomAccessFile来实现这一点,但是C#没有给我留下这样的内置函数 任何其他解决方法或解决方案将不胜感激 -阿迪尔 是否可以写入(追加-不覆盖)现有的二进制文件 追加将在末尾添加数据。那很好。在读/写模式下打开流后,只需搜索到流的末尾 不过,听起来您想插入数据,但这不可用。它不是文件系统倾向于支持的东西。您需要将原始文件的第一部分

是否可以写入(追加-不覆盖)现有的二进制文件

我必须以读写模式打开一个文件,然后在文件中指定的位置随机写入字节数组

我来自Java背景,我使用Java中的RandomAccessFile来实现这一点,但是C#没有给我留下这样的内置函数

任何其他解决方法或解决方案将不胜感激

-阿迪尔

是否可以写入(追加-不覆盖)现有的二进制文件

追加将在末尾添加数据。那很好。在读/写模式下打开流后,只需搜索到流的末尾

不过,听起来您想插入数据,但这不可用。它不是文件系统倾向于支持的东西。您需要将原始文件的第一部分复制到新文件中,写入新数据,然后复制原始文件的其余部分

顺便说一句,
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);
}

这是一个在文件中间插入字节的简单快捷的解决方案,以防万一有人会搜索插入数据并找到这个问题。

public void ExpandFile(FileStream stream, long offset, int extraBytes)
{
  // http://stackoverflow.com/questions/3033771/file-io-with-streams-best-memory-buffer-size
  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);
  }

需要检查,但是…

没有内置的功能来执行此操作。如果通过设置流的位置字段将文件搜索到特定位置(偏移量),然后在该位置写入新的字节数组,这将覆盖该位置之后的现有字节。您需要将偏移量后的现有字节按预期字节数组的长度进行移位,然后在偏移量后写入字节数组。代码如下:

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);
}
公共静态void InsertIntoFile(FileStream流,长偏移量,字节[]外部字节)
{
if(偏移量<0 | |偏移量>流长度)
{
抛出新ArgumentOutOfRangeException(“偏移量超出范围”);
}
常量int maxBufferSize=1024*512;
int bufferSize=maxBufferSize;
长温度=流长度-偏移量;

if(temp,谢谢Jon,我所说的追加是指在文件中我指定的位置的任何位置追加。RandomAccessFile可以做到这一点。RandomAccessFile raf=new RandomAccessFile(file,“rw”);raf.seek(longPos);raf.write(byteArray);@user1244484:正如我所说,这就是插入数据。追加的行为严格适用于在某个东西的末尾添加数据。不,你不能在Java或.NET中这样做。你在Java中使用
RandomAccessFile
得到的任何代码都会覆盖现有数据。是的,你是正确的。它会被覆盖。但是你有什么方法可以覆盖它吗R在C#中写到用户定义的位置。@user1244484:是的-我会编辑。但它确实改变了你问题的整体含义……太棒了!效果很好。谢谢你(y)