如何调整文件大小,“修剪”;它的开始

本文关键字:修剪 开始 何调整 调整 文件大小 | 更新日期: 2023-09-27 18:08:19

我正在使用c#实现一个基于文件的序列化对象队列。

  • Push()将对象序列化为二进制文件,并将其附加到文件的末尾。
  • Pop()应该从文件的开头反序列化对象(这部分我开始工作)。然后,将反序列化的部分从文件中删除,使下一个对象为"first"。

从文件系统的角度来看,这意味着将文件头在磁盘上再复制几个字节,然后移动"文件开头"指针。问题是如何在c#中实现这一点?有可能吗?

如何调整文件大小,“修剪”;它的开始

我能看到的最简单的

1)输出(如日志,转储到文件中),
(注意:你需要一些分隔符和你的"文件"的"一致格式"-基于你的数据是什么)

2)和之后的流(只是从开始读取文件,一次执行,并且不删除任何内容)

,那就好了,FIFO(先进先出)。

所以,我的建议-不要试图通过删除,跳过来优化它等等(而不是重新组合和使用更多的文件。

3)如果你担心事情的规模-那么只需将其"分区"到足够小的文件中,例如每个100或1,000 records(取决于,做一些计算)。

你可能需要在这里做一些'virtualizer',它映射文件,跟踪你的'数据库',如果它包含多个文件。最简单的方法是使用文件系统并检查文件时间等。或者添加一些基本代码来改进。

然而,我认为你可能有问题,如果你必须确保'transactions' -即如果事情失败了,你需要跟踪在文件停止的地方,重新跟踪等

这可能是一个问题,但你最清楚是否真的有必要这样做(多么重要)。你可以按"每个文件"或更小的文件进行操作。如果失败,则回滚并重新执行文件(或记录问题)。如果它成功,你可以删除文件(成功后),并继续这样。

这是非常"手工"的方法,但应该让你用一个简单的,不太苛刻的解决方案(如你所描述的)。或者类似的东西。

我应该加上

你也可以省去一些麻烦,使用一些便携式数据库或类似的东西。这纯粹是基于手工编码一个最简单的解决方案的想法(我们可能会想出一些更聪明的东西,但迟到了,这是我的:)。

文件不是这样工作的。你可以把尾剪掉,但不能把头剪掉。为了改变文件以在开始时删除内容,您需要重写整个文件。

我想你会想找其他方法来解决你的问题。但线性文件是完全不适合表示FIFO队列。