请教:如何删除文件的部分数据?

sqatiao 2011-11-29 12:20:15
先说明一下我的要求:
查看网上的帖子和教材,都是教:kill原文件,然后重新保存一个同名的文件.
但是这样有个问题,原文件只是在磁盘上标记了已经删除,原来的数据依然保留在硬盘原来的位置.而新文件是保存在一个新开辟的空间.
这样的操作相当于普通windows程序(例如记事簿)的“另存为。。。”后再删除原文件。而我要的是直接按“保存”的效果。(直接保存,是在磁盘的原来位置修改数据,以及修改文件结束标识,文件指针和文件的起始地址不变)
看VB的文件操作,OPEN一个文件后,添加数据和修改数据后保存(文件长度不变或者增加),是可以的。

由于我要用MCU对SD卡上保存的文件进行操作,由于工作量以及运算速度等方面的原因,希望修改文件后,该文件的相关指针不发生改变。

正题:
我现在的问题是:数据减少时,该怎样修改文件?
...全文
87 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sqatiao 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermanking 的回复:]
这样看看

VB code


Open "A:\1.txt" For Output As #1
Close #1
Open "A:\1.txt" For Binary As #1
Put #1,1,YourByteArray
Close #1
[/Quote]

谢谢超人王,确实可以.
现在还是人类 2011-11-29
  • 打赏
  • 举报
回复
; 第一次写入后的 FDT 表
00002600h: 21 20 20 20 20 20 20 20 54 58 54 20 10 18 64 BD
00002610h: 7D 3F 7D 3F 00 00 65 BD 7D 3F 02 00 14 00 00 00

; 第一次写入后的 FAT 表
00000200h: F0 FF FF FF 0F 00 00 00 00 00 00 00 00 00 00 00

; 第一次写入后的数据表
00004200h: 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
00004210h: 48 48 48 48 00 00 00 00 00 00 00 00 00 00 00 00


; 改动之后的 FDT 表
00002600h: 21 20 20 20 20 20 20 20 54 58 54 20 10 18 64 BD
00002610h: 7D 3F 7D 3F 00 00 84 BD 7D 3F 02 00 05 00 00 00

; 改动之后的 FAT 表
00000200h: F0 FF FF FF 0F 00 00 00 00 00 00 00 00 00 00 00

; 改动之后的数据表
00004200h: 31 31 31 31 31 00 00 00 00 00 00 00 00 00 00 00
00004210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
现在还是人类 2011-11-29
  • 打赏
  • 举报
回复
帮你测试过,可行
现在还是人类 2011-11-29
  • 打赏
  • 举报
回复
这样看看

Open "A:\1.txt" For Output As #1
Close #1
Open "A:\1.txt" For Binary As #1
Put #1,1,YourByteArray
Close #1
sqatiao 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shaogang77 的回复:]
如果数据量小,整个读出数据给变量,对变量进行操作删减,然后再以覆盖的方式写文件,将修改后的变量添加进去
[/Quote]
印象中我试过这样是不行的.假设fileA.txt文件里有5个的数据12345,读出到数组后修改为abc回存到打开的文件里,得到的结果是abc45.而我要的结果是abc.
sqatiao 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ybh37 的回复:]
但是这样有个问题,原文件只是在磁盘上标记了已经删除,原来的数据依然保留在硬盘原来的位置.而新文件是保存在一个新开辟的空间.
不都是这样的吗?这个逻辑有问题吗?

原文件只是在磁盘上标记了已经删除⋯⋯磁盘管理不都是这样的?这样就等于说,这块存储区已经释放了。
[/Quote]
回楼上:这个逻辑没问题,但不是我想要的结果.这结果在windows操作系统下自然没问题,在操作系统下也感觉不出2种修改方式有什么差异.但是我的单片机没有操作系统,要直接读取磁盘的数据来使用,这时候就有区别了.
我现在是不想释放这块存储空间,只想减少这块存储空间,因为在新的空间存储新数据的话,单片机要重新搜索文件进行定位和排序,单片机的运算量比较大,我希望减轻单片机的运算量来提高设备的运行速度.

简单地说:我是希望文件在磁盘上的起始地址不变,只改变文件长度标识.(就像API的setendoffile函数一样,重新定义文件的长度.用VB该怎么做?)
咸清 2011-11-29
  • 打赏
  • 举报
回复
但是这样有个问题,原文件只是在磁盘上标记了已经删除,原来的数据依然保留在硬盘原来的位置.而新文件是保存在一个新开辟的空间.
不都是这样的吗?这个逻辑有问题吗?

原文件只是在磁盘上标记了已经删除⋯⋯磁盘管理不都是这样的?这样就等于说,这块存储区已经释放了。
shaogang77 2011-11-29
  • 打赏
  • 举报
回复
如果数据量小,整个读出数据给变量,对变量进行操作删减,然后再以覆盖的方式写文件,将修改后的变量添加进去

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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