PowerShell でバイナリコピー

コマンドプロンプトで言うところの copy /b を PowerShell でやってみます。簡易版コピーと FileStream を使ったコピーの2種類をご紹介します。この手のサンプルはネットには大量にころがってるのですが、意外と検索し難かったので(検索の仕方の問題という話も、、、)メモ代わりに残しておきます。

簡易版コピー

指定されたファイルを一旦全て読み込んで、一気に書き込むという方法です。超簡単ですが、サイズの大きなファイルでは死んでしまうというコピー方法です。

# ファイル名定義
$src="D:\TEMP\binfile1"
$dst="D:\TEMP\binfile2"

# バイナリコピー 
$wbuf = [System.IO.File]::ReadAllBytes($src);
[System.IO.File]::WriteAllBytes($dst,$wbuf);

FileStream を使ったコピー

FileStream を使って指定されたサイズを読み込みながら、そのまま書き込んで行く方法です。サイズが大きなファイルでも大丈夫かと。

# ファイル名定義
$src="D:\TEMP\binfile1"
$dst="D:\TEMP\binfile2"

# コピーサイズ
$chunk=8192

# ファイルオープン 
$reader = [System.IO.File]::OpenRead($src)
$writer = [System.IO.File]::OpenWrite($dst)

# バイナリコピー
$wbuf = New-Object byte[]( $chunk )
while( $true )
{
    # 対象ファイルを指定サイズ読み込み
    $size = $reader.Read($wbuf,0, $chunk)
    if ( $size -eq 0 )
    {
        break;
    }

    # 書き込み
    $writer.write($wbuf,0,$size)
}
$reader.Close()
$writer.Close()

WindowsPowerShell

Posted by takmaru