4

.NET 中有没有一种方法可以创建具有特定大小的文件而无需写入文件?

我需要能够在特定位置书写,根据需要留下空白空间。实现这一目标的最佳方法是什么?

4

3 回答 3

7

您可能不知道,但您可能会问这个问题“如何在 .Net 中创建稀疏文件?” 看到这个问题

简短的回答是您不能使用托管代码创建稀疏文件,但是,您可以使用本机 API——问题是稀疏文件“仍然是稀疏的”。因此,如果您想稍后回填,最好不要这样做。您可以使用打开的 FileStream 并调用 SetLength() 如果您只是想避免将显式填充器显式写入文件的细节,O/S 仍将使用 NUL 填充文件的“空”部分

public override void SetLength(
    long value
)

添加

请注意,在这种情况下,文件不一定在磁盘上进行物理扩展。但是,如果您从“尾部间隙”读取,您将获得 NUL,如果您写入间隙,O/S 将使用 NUL 回填中间空间。NTFS 分别维护“有效长度”和“文件长度”。调用 SetLength 不会更改有效长度,只会更改文件长度。“尾部间隙”是从有效长度和文件长度跨越的文件区域。另请注意,Windows 支持设置有效长度。写入尾部间隙或文件末尾也会更新有效长度。

因此,您可以通过不必立即实际扩展文件来避免性能损失,但迟早 O/S 将不得不花时间回填 NUL 填充块(并将有效长度设置为新的写入位置) ,当您写入尾部间隙时,可能会留下较小的尾部间隙。

请注意,在扩展文件时从磁盘获取现有数据的随机块将是一个安全问题——想象一下使用 SSN 获取工资单数据。

如果 Windows 添加一个新的文件系统,确切的行为可能会变得更加复杂,但可能至少与 NTFS 上发生的一样好。

于 2013-11-14T19:00:20.920 回答
0

文件是磁盘上的一系列字节,不同的格式有不同的部分,如头、正文等。因此没有空文件这样的东西。因为每个字节都是保留的,每个字节(或 Unicode 中的两个字节)将代表一个字符。即使在它的初始状态。

因此,从技术上讲,您想要的是在磁盘上保留一定量的空间,以便以后可以在那里写入。

现在,如果您不想在该文件中包含可读或可见的字符,您可以简单地创建一个填充了许多空白字符的文件。

于 2013-11-14T18:54:42.550 回答
0

无论如何你都需要写它

File.WriteAllText(path,new String(' ',size));

然后你可以seek到一个特定的位置写..

于 2013-11-14T18:56:10.670 回答