巨大なファイルのうち、1バイトだけを編集したい場合に使えるテクニックです。
100億1バイトあるファイルをメモ帳で開こうとした結果のダイアログ
---------------------------
メモ帳
---------------------------
ファイル D:\Bin\file.bin は大きすぎてメモ帳では編集できません。
別のエディターを使って編集してください。
---------------------------
OK
---------------------------
「別のエディターを使って編集してください。」
別のエディターって何だろう?できればWindowsに最初からあるやつがいい……
それはPowerShellのことでしょうか。
やることは単純です。
PowerShellの.NETパワーを活用してSystem.IO.FileStreamを取得し、好きなだけシークして値を読み書きします。
Windows10のPowerShellを使います。
当環境の$PSVersionTable です。
> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.17763.316
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.316
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
サンプル
100億1バイトのファイルが無い場合は作ります。
作業場は D:\Bin ディレクトリとします。ハードディスクには空き容量が必要です。
PowerShellはWin+X,Iショートカットで起動して、cd D:\Bin で移動してください。
PS D:\Bin> $fs=[IO.File]::Create($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.WriteByte(0);$fs.Close()
数分かかることがあります。
終わったらファイルがあるか確認します。
PS D:\Bin> ls
ディレクトリ: D:\Bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2038/01/19 3:14 10000000001 file.bin
うまくいきました!ファイルを読み書きしましょう。
読む
ファイルの先頭を0バイト目として、100億バイト目を1バイト読みます。結果がPowerShellの画面に表示されます。
PS D:\Bin> $fs=[IO.File]::OpenRead($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.ReadByte();$fs.Close()
0
書く
「99」という値1バイトを書き込みます。100億バイト目が1バイト上書きされます。
$fs=[IO.File]::OpenWrite($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.WriteByte(99);$fs.Close()
同じ場所をもういちど読むと99になったことが確認できます。
PS D:\Bin> $fs=[IO.File]::OpenRead($pwd.Path+"\file.bin");$fs.Position=10000000000;$fs.ReadByte();$fs.Close()
99
これで目的は達成しました。
メモ帳でできるようになった時代の人が見たら、化石かよって思うに違いありません。