C#如何删除后缀为.BIN二进制文件某一段的数据?

wuganxiu 2019-03-27 02:06:09
C#如何删除后缀为.BIN二进制文件某一段的数据?我弄了一个软件,把一些数据保存为后缀为.BIN的二进制文件,有4G多,为了方便修改,比如说,其中某一段的数据不需要,直接删除,我现在的方法是,把后面的数据往回写,覆盖需要删除的数据,但是这样尾部就多出了一些数据,还有就是把不要删除的数据写到另外一个文件,但是由于数据大,速度都很慢,有没有快速的方法,谢谢
...全文
1246 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuganxiu 2019-04-08
  • 打赏
  • 举报
回复
非常感谢,谢谢
angel6709 2019-04-08
  • 打赏
  • 举报
回复
不要造轮子,这种情况允许正删改查的应该是数据库。
stherix 2019-04-08
  • 打赏
  • 举报
回复
引用 20 楼 wuganxiu 的回复:
大家好,请教一下,这个为什么会溢出,我用的是VS2010 win7 64位的操作系统,要怎么设置呢
在所有数字后面加L,比如1024L
wuganxiu 2019-04-08
  • 打赏
  • 举报
回复

大家好,请教一下,这个为什么会溢出,我用的是VS2010 win7 64位的操作系统,要怎么设置呢
  • 打赏
  • 举报
回复
lz 只是恰好把文件后缀起名为 .bin。他估计是暂时处理固定大小的数据,所以以为所有数据记录块永远都一样大,只需要在文件中简单地前后移动数据记录块。但是显然,频繁前后移动数据记录块就会很悲伤。
  • 打赏
  • 举报
回复
引用 17 楼 luj_1768 的回复:
*.bin 好像是系统能识别的一种专用文件,用于存储二进制代码,链接后就是可执行文件了。一般情况下,basic, c#, FORTRAN, ... 好像都是使用这个扩展名的。我觉得,如果能换一个扩展名,你可能就没有这么多困扰了。。。
lz 没有纠结后缀名问题。它不过是用了 .bin 作为自定义格式文件的后缀,并没有标题党。
luj_1768 2019-03-30
  • 打赏
  • 举报
回复
*.bin 好像是系统能识别的一种专用文件,用于存储二进制代码,链接后就是可执行文件了。一般情况下,basic, c#, FORTRAN, ... 好像都是使用这个扩展名的。我觉得,如果能换一个扩展名,你可能就没有这么多困扰了。。。
千里送人头 2019-03-29
  • 打赏
  • 举报
回复
重新设计bin的写入方式,可以直接丢弃你要覆盖的位置.
jx315425246 2019-03-29
  • 打赏
  • 举报
回复

/// <summary>
/// 文件截取
/// </summary>
/// <param name="filename">文件名</param>
/// <param name="star">要截取的起始位置,0为第1位(不包括要截取的数据)</param>
/// <param name="end">要截取的结束位置,0为第1位(不包括要截取的数据)</param>
public void set_file(string filename, int star, int end)
{
int i, j;
long k;
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);
k = fs.Length;
byte[] buf = new byte[k - end];
fs.Seek(end, SeekOrigin.Begin);
i = fs.Read(buf, 0, buf.Length);
fs.SetLength(star + 1);
fs.Flush();
fs.Seek(star+1, SeekOrigin.Begin);
fs.Write(buf, 0, buf.Length);
fs.Close();
}
秋的红果实 2019-03-28
  • 打赏
  • 举报
回复
用0覆盖,文件尾指针会不会自动收缩,纯粹猜想
秋的红果实 2019-03-28
  • 打赏
  • 举报
回复
既然不用数据库,那就得研究下这个https://docs.microsoft.com/zh-cn/dotnet/api/system.io.file?view=netframework-4.7.2 找到尽可能高效的方法 至于数据往回写后,尾部处理,试一下用0覆盖,没依据,试一下 原理上需要修改文件的尾指针EOF,C#里,我不知道,但C++有,或者用系统win32 API sql的mdb文件好像是不能缩小的,只能越来越大。
  • 打赏
  • 举报
回复
简单地修改文件的 length 信息,其实不能很完善地管理数据记录。仔细设计一下基本模式。
  • 打赏
  • 举报
回复
实际上,数据文件顶部可以有几十个字节的管理信息,例如数据链表地址、空闲链表地址,索引链表地址,数据定义模型内容地址。 这就是数据库系统基本概念!
  • 打赏
  • 举报
回复
引用 7 楼 wuganxiu 的回复:
您是说直接保存到数据库,不用二进制文件的方式保存是吗?我对数据库不熟,谢谢
如果你能“把后边的数据往回写”这其实就是一种数据库管理方法——文件内容分块存储。 但是数据块本身也要有一些管理信息来说明里边的实际数据大小(也就是说容许数据块中有空闲空间)。 而且既然每一个数据块容许有空闲空间,甚至一个数据块中可以嵌入多个数据记录(为了减小空闲空间),那么其实你就应该容许数据块有个数据链表和空闲数据块链表。从而,其实你就无需将尾部数据块“往回写”,而是只需要把中间删除的数据块从实际链表上摘下、链入空闲数据块链表上就行了。从而你只要多一点数据结构概念,就可以提高系统几万倍速度。
wuganxiu 2019-03-28
  • 打赏
  • 举报
回复
这样长度是重新设定了,可原来的数据丢失,全变为00了,有什么办法可以不丢失数据吗
jx315425246 2019-03-27
  • 打赏
  • 举报
回复
FileStream fs = new FileStream("文件名", FileMode.Open, FileAccess.ReadWrite);
fs.SetLength(长度);
fs.Flush();
fs.Close();
wuganxiu 2019-03-27
  • 打赏
  • 举报
回复
您是说直接保存到数据库,不用二进制文件的方式保存是吗?我对数据库不熟,谢谢
groveer 2019-03-27
  • 打赏
  • 举报
回复
4g大的文件,为何不用数据库,sqlite数据库就蛮好使
stherix 2019-03-27
  • 打赏
  • 举报
回复
引用 4 楼 wuganxiu 的回复:
如何重设文件长度?网上没查到资料,谢谢
FileStream.SetLength
wuganxiu 2019-03-27
  • 打赏
  • 举报
回复
如何重设文件长度?网上没查到资料,谢谢
加载更多回复(3)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧