仅读取和写入文件的文件部分(无流)

Read and Write File Section of File Only (Without Streams)

大多数文件的高级表示都是流。 C 的 fopen、ActiveX 的 Scripting.FileSystemObjectADODB.Stream - 事实上,任何构建在 C 之上的东西都非常有可能使用流表示来编辑文件。

但是,当修改大型 (~4MiB) 固定结构二进制文件时,将整个文件读入内存并将几乎完全相同的内容写回磁盘似乎很浪费 - 这几乎肯定会带来性能损失.看看大多数未压缩的文件系统,在我看来,没有理由不能在不触及周围数据的情况下读取和写入文件的一部分。最多,该块将不得不被重写,但这通常是 4KiB 的量级;比大文件的整个文件少得多。

示例:

00 01 02 03
04 05 06 07
08 09 0A 0B
0C 0D 0E 0F

可能会变成:

00 01 02 03
04 F0 F1 F2
F3 F4 F5 0B
0C 0D 0E 0F

使用现有 ActiveX 对象的解决方案是理想的,但无需重写整个文件的任何方式都很好。

好的,下面是如何在 powershell 中进行练习(例如 hello.ps1):

$path = "hello.txt"
$bw = New-Object System.IO.BinaryWriter([System.IO.File]::Open($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::ReadWrite))
$bw.BaseStream.Seek(5, [System.IO.SeekOrigin]::Begin)
$bw.Write([byte] 0xF0)
$bw.Write([byte] 0xF1)
$bw.Write([byte] 0xF2)
$bw.Write([byte] 0xF3)
$bw.Write([byte] 0xF4)
$bw.Write([byte] 0xF5)
$bw.Close()

您可以从命令行测试它:

powershell -file hello.ps1

然后,您可以从 HTA 调用它:

var wsh = new ActiveXObject("WScript.Shell");
wsh.Run("powershell -file hello.ps1");