如何调整文件大小,"修剪"它的开始?

时间:2013-04-10 10:05:46

标签: c# file filesystems queue

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

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

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

2 个答案:

答案 0 :(得分:1)

我最容易看到

1)流出(如日志,将其转储到文件中),
(注意:根据您的数据,您需要一些分隔符和“文件”的“一致格式”)

2)后来流入(只需从头开始读取文件,一次性处理,无需删除任何内容)

并且它工作正常,FIFO(先进先出)。

  

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

3)如果您担心事物的规模 - 那么只需将其“分割”成足够小的文件,例如每100或1,000 records(取决于,做一些计算)。

你可能需要在这里制作某种“虚拟器”,它可以映射文件,跟踪你的“数据库”,如果是在多个文件上。最简单的方法是只使用文件系统并检查文件时间等。或者添加一些基本代码来改进它。

  

但是,如果你必须确保,我认为你可能会遇到问题   '交易' - 即如果事情失败,您需要跟踪   文件中断,回溯等。

这可能是一个问题,但如果真的有必要(你有多么重要),你最了解。您可以始终按“每个文件”和较小的文件工作。如果失败,则回滚并再次执行该文件(或记录问题)。如果成功,你可以删除文件(成功后)并继续这样做。

这是一种非常“手工制作”的方法,但是应该让你选择一个简单且不太苛刻的解决方案(就像你所描述的那样)。或类似的规定。

我应该添加 ...

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

答案 1 :(得分:1)

文件无法正常工作。你可以削减结束,但不是开头。为了改变文件以在开头删除内容,您需要重新编写整个文件。

我希望您能找到其他方法来解决您的问题。但是线性文件完全不适合表示FIFO队列。