【问题标题】:Is it possible in c# to write a binary file with a file size that is not divisible by 4?是否可以在 c# 中编写文件大小不能被 4 整除的二进制文件?
【发布时间】:2020-07-23 14:32:08
【问题描述】:

我正在尝试使用 c# 创建一个 506 KB 的二进制文件(我用来修改游戏)。但是,无论我尝试什么,文件大小总是可以被 4 整除(不幸的是 506 不是)。例如,我得到的结果文件为 504 KB。我已经得到它是 508 KB。但是,我无法将其设为 506 KB。有没有办法让你得到的文件大小不必被 4 整除?这是我尝试过的示例(最终仍会生成大小为 504 KB 的文件):

int k = 1024 * 506; //because there are 1024 bytes in a KB and I want 506 KB` `

 BinaryWriter writer = new BinaryWriter(System.IO.File.OpenWrite("path"));
            
 for(int i = 0; i < k; i++)`
 {
   writer.Write(Convert.ToByte(false));
 }   

【问题讨论】:

  • 您在这里遗漏了一些重要信息。 1. 为什么需要它不能被 4 整除? 2. 多余的字节是什么?
  • 另外,您的单位也存在一些不确定性。千字节还是千字节?真的是你说的尺寸,还是你读错单位了?
  • 你怎么知道文件的大小?向我们展示显示文件大小的属性对话框的屏幕截图 - 文件大小和磁盘上的大小可能是两个不同的东西,您可能看的不是正确的
  • 一个更好的讨论指标是写入的确切字节数。
  • 我尝试了你的代码(只是在最后添加了writer.Close)并且无法重现你的问题。以下是文件详细信息:Size: 506 KB (518.144 bytes), Size on disk: 508 KB (520.192)。对我来说看起来不错,518144 正好是 1024*506。磁盘上的大小显然更大,因为NTFS has a default cluster size of 4KB

标签: c# binaryfiles system.io.file


【解决方案1】:

我的猜测是您已将文件写入具有 4kb 集群的磁盘:

顺便说一句,File.WriteAllBytes(path, new byte[506 * 1024]) 可能是一种将 518144 个零字节准确写入磁盘的更简洁和高效的方式,而不是将 false 逐一转换为字节..

【讨论】:

    【解决方案2】:

    我刚刚尝试将writer.close() 添加到我的代码中,这就像一个魅力。我得到了我需要的 506 KB 文件。

    【讨论】:

      猜你喜欢
      • 2015-11-29
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多