首页 新闻 会员 周边 捐助

C# 如何二进制文件在头部插入字节数组操作

0
悬赏园豆:5 [已解决问题] 解决于 2013-09-02 11:36

如题 

使用C# 中 FileStream 对象操作二进制文件

大体上的代码,我目前这里没有VS环境 

FileStream fs = new FileStream(filepath,FileMode.OpenOrCreate,FileAccess.ReadOrWrite);

fs.seek(0,Ogein.Begin);

fs.Write(myBytes,0,myBytes.Length);

执行完后,这一小段代码并没有抛出异常。

但是虽说myBytes的字节长度也就是70多。但是一查看文件,文件的大小是没有发生变化的。

后使用Ultra Edit 打开这个文件,发现他和源文件(写入的文件是从源文件那里复制过来的)相比,只是从头部到myBytes结尾那里进行改写操作。而不是插入操作。请问要想实现插入操作不会是要先把文件里面的内容读出来,形成一个二进制文件数组(WriteArray),然后再手动的在这个WriteArray字组的头部加入我要写的信息吧?这样如果这个二进制文件太大了,内存放不下咋办? 

如何操作?请解答 谢谢  

二十二号同学的主页 二十二号同学 | 小虾三级 | 园豆:790
提问于:2013-09-02 11:12
< >
分享
最佳答案
0

1、新建一个文件,先写入你的 myBytes ,然后从原文件每次读取4096写入到新文件中,或者用 FileStream.CopyTo。

2、将 myBytes 写入一个单独的文件,然后用 dos 的 copy 命令同原来文件合并。、

收获园豆:2
Launcher | 高人七级 |园豆:45050 | 2013-09-02 11:22

囧。。。

对了 为什么第一个每次都是4096 ? 是个经验值还是windows上有限定?

二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:27

哦 查到了 

bufferSize类型:System.Int32
缓冲区的大小。 此值必须大于零。 默认大小为 4096。 

是这个意思吧 

二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:28

@天生俪姿: NTFS文件系统每簇的默认大小就是 4096 。但是之前好像有个测试,每次读写 512 才是性能最高的。

Launcher | 园豆:45050 (高人七级) | 2013-09-02 11:31

@Launcher: 

嗯 了解 谢谢! 

二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:33
其他回答(2)
1

参考C# prepending bytes to the beginning of a file

int numberOfBytes = 100;
byte newByte = 0x1;

using ( var newFile = new FileStream( @"C:\newfile.dat", FileMode.CreateNew, FileAccess.Write ) )
{
    for ( var i = 0; i < numberOfBytes; i++ )
    {
        newFile.WriteByte( newByte );
    }
    using ( var oldFile = new FileStream( @"C:\oldfile.dat", FileMode.Open, FileAccess.Read ) )
    {
        oldFile.CopyTo(newFile);
    }
}

// Rename and delete files, or whatever you want to do
收获园豆:2
dudu | 园豆:30925 (高人七级) | 2013-09-02 11:32

这个。。。呃~~

我直接复制了~~ 

3Q

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:35

嗯 不过我还是先给 1楼的吧。。 同样谢谢dudu 还有会长 

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:37
1

没有直接Insert的办法........

收获园豆:1
会长 | 园豆:12463 (专家六级) | 2013-09-02 11:34

嗯。 晓得了

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2013-09-02 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册