加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在DOS / FAT中缩小或部分截断文件

发布时间:2020-12-14 05:29:23 所属栏目:Windows 来源:网络整理
导读:我的任务是编写一个 Unitech HT630的数据收集程序,它运行一个专有的DOS操作系统,可以运行为16位MS DOS编译的可执行文件,但有一些限制.我使用的是Digital Mars C/C++编译器,到目前为止运行良好. 其中一个应用程序要求是数据文件必须是人类可读的纯文本,这意味
我的任务是编写一个 Unitech HT630的数据收集程序,它运行一个专有的DOS操作系统,可以运行为16位MS DOS编译的可执行文件,但有一些限制.我使用的是Digital Mars C/C++编译器,到目前为止运行良好.

其中一个应用程序要求是数据文件必须是人类可读的纯文本,这意味着该文件可以导入Excel或由记事本打开.我正在使用像CSV一样的可变长度记录格式,我已经使用C标准库文件I / O函数成功实现了.

保存记录时,我必须计算更新的记录是大于还是小于数据文件中当前记录的版本.如果更大,我首先将当前记录之后的所有记录立即转移所计算的大小差异,然后再保存更新的记录.操作系统自动扩展EOF以容纳额外数据.如果更小,我将所有记录向后移动我计算的偏移量.这很好用,但我发现无法修改EOF标记或文件大小以忽略最后一条记录结束后的数据.

大多数时间记录的大小会增加,因为数据收集程序将在保存记录时用数据填充一些空字段.记录只会在对现有条目进行更正时缩小,或者在正常记录上进行缩减,如果记录中的描述性数据长于程序在内存中读取的数据.

在收缩记录的情况下,在文件中的最后一条记录之后,我留下了在转移之前坐在那里的任何数据.在“缩小记录保存”之后,我一直在向文件中写入EOF分隔符,以指示记录结束的位置并填充剩余数据,但是在“增长记录保存”之前我不再有一个干净的文件在空间填充区域上扩展文件的大小. unistd.h中的truncate()函数不起作用(我现在认为这只适用于* nix风格?).

我见过的一个提出的解决方案涉及创建第二个文件并将要保存的所有数据写入该文件,然后删除原始文件.由于我只有4MB的磁盘空间可供使用,如果文件大小小于2MB减去程序可执行文件和配置文件的大小,则可以使用,但否则会失败.当它投入生产时,用户最终可能会得到一个超过2MB的文件.

我已经看过Ralph Brown’s Interrupt List和IBM PC Assembly Language and Programming中的中断参考,我似乎找不到任何更新文件大小或类似的东西.

是否减少文件的大小而不在DOS中创建第二个文件?

解决方法

要在DOS中减小文件大小,可以使用int 21(ax = 4200h,bx = handle,cx:dx = offset)进行截断,并使用零长度调用write:int 21(ax = 4000h,cx = 0(意味着截断))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读