【问题标题】:Read and Write File Section of File Only (Without Streams)仅文件的读写文件部分(无流)
【发布时间】:2016-01-16 18:09:52
【问题描述】:

文件的大多数高级表示形式都是流。 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 对象的解决方案是理想的,但无需重写整个文件的任何方式都可以。

【问题讨论】:

  • 您能否更新您的问题以包含尝试的代码 sn-ps?此外,hta / javascript 是绝对必须的。如果您对这项技术很灵活,您是否考虑过 PowerShell? stackoverflow.com/questions/20935356/…
  • @StephenQuan 我的意思是一种非基于流的文件管理方法。我不知道如何在 C 中做到这一点,并且被告知在 Python 中这是不可能的......这可能是不可能的!您提供的链接只是打开一个文件,然后保存修改后的副本,再次写入所有未更改的字节...出于速度原因,我想要一种仅触摸修改后的字节的方法。
  • 顺便说一句,我不是反对你的问题的人,我想知道为什么人们也认为这是一个坏问题,因为我认为这是一个合理的问题。我认为 PowerShell 仍然是一种有效的方法。您仍然可以使用 HTA 作为您的前端 UI,并按照以下方式执行操作:stackoverflow.com/questions/20935356/…
  • @StephenQuan 是的,但是......好的。想象一下,我正在处理一个 500GB 的文件,我需要更改 273 个字节,所有这些都分散在文件周围。仅对于这 273 个字节,再次读取和写入整个文件需要很长时间。所以我正在寻找一种以“非常低级别”的方式编辑字节的方法,而不是从流 A 读取并写入流 B(高级内容)!
  • 就我而言,如果我遇到这个问题,我会考虑构建自己的 ActiveX 库。话虽如此,您可能可以下载一些东西,但是,我怀疑您正在寻求零安装足迹来实现您的目标?

标签: windows file activex activexobject


【解决方案1】:

好的,下面是如何在 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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2013-09-20
    相关资源
    最近更新 更多