2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メモ帳ではできない Windows10 PowerShell で100億1バイトのファイルを1バイト編集する

Posted at

巨大なファイルのうち、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

これで目的は達成しました。

メモ帳でできるようになった時代の人が見たら、化石かよって思うに違いありません。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?