大きくてファイルが送れない時に!Windows「PowerShell]でデータを分割・結合する方法

スポンサーリンク

動画や大きなデータを送りたいのに、メールやチャットツールの容量制限に引っかかって送れない…… 、こんな風に困ったことはありませんか?

ZIPファイルにしても大して縮小されない事も多々あると思います。
クラウドストレージを使うのも手ですが、会社のセキュリティルールで禁止されていたり、相手の環境によってはダウンロードできなかったりすることもありますよね。

実は、怪しい外部ソフトをわざわざインストールしなくても、Windowsに最初から入っている機能だけで、大きなファイルを小分けに「分割」して送り、受け取った側で元の1つに「結合」することができます。

本記事では、誰でもすぐに実践できる「PowerShellを使った方法」を、分かりやすく解説します!

もちろんZIPファイルでも分割できます

powershellで分割方法

このファイルを分割します
(コマンドで100Mと1Gのファイルを作りました。)

Powershellを起動

検索窓で「powershell」を検索して、出てきたPowershellを起動します。
 ※「powershell ISE」でも問題ありませんが、統合開発環境なので紛らわしいので、ISEじゃない方が良いかな

(X86)って方も有りますが、最近のPCなら(X86)無しの方を選んでおけばOKです。

ファイルパスを取得しておきます
指定のファイルをキーボードの「Shift」を押しながら、マウスの右クリックで出てきます

Powershellのコマンドです

$file = "ファイルパス"          # 分割したいファイルのパス
$size = 400MB                   # 分割したいサイズ(10MB、500KB、1GB など指定可能)
$buffer = New-Object byte[] $size
$reader = [System.IO.File]::OpenRead($file)
$count = 1

while ($bytesRead = $reader.Read($buffer, 0, $buffer.Length)) {
    $outputPath = "$file.part$count"
    $writer = [System.IO.File]::OpenWrite($outputPath)
    $writer.Write($buffer, 0, $bytesRead)
    $writer.Close()
    $count++
}
$reader.Close()

上のコマンドをコピーしてpowershellにペーストします。
※ファイルパスとサイズは自身の環境に合わせて

分割されました
1ギガを400Mで分割したので、3ファイルになりました
100Mは50Mで分割したので、2ファイルです

ファイル結合

分割したら、相手に渡します

渡されたら、今度は結合します。

powershellで実行

powershellで実施する場合は下記のコマンドで実施してください。

Get-Content "ファイルパス\分割したファイル名.part1", "ファイルパス\分割したファイル名.part2", "ファイルパス\分割したファイル名.part3" -Encoding Byte -Raw | Set-Content "ファイルパス\結合後のファイル名" -Encoding Byte

#この方法でも可能
#こっちは"分割したファイル名.part*"で、*(ワイルドカード)でpartXXとなっているファイルを全部結合します
Get-Content "ファイルパス\分割したファイル名.part*" -Encoding Byte -Raw | Set-Content "結合後のファイル名" -Encoding Byte

実験の時はファイルパスをしているスト長くて面倒なので、対象のフォルダに移動して実行してます

cd “ファイルパス”

で移動できます
※ファイルは指定しないでフォルダを指定してください

結合するのに少々時間が掛かります。
成功するとファイルが出来ます

エラーになったら

1Gのファイルを結合しようとしたら下記のエラーになりました。
結合するファイルが大きいとエラーになるようなので、こうなったら次のコマンドで実施してください
System.OutOfMemoryException(メモリ不足エラー)

# 出力先ファイルを指定してストリームを開く
$target = [System.IO.File]::Create("$PWD\結合後のファイル名")

# 結合したいファイルを順番に処理する
"ファイルパス\分割したファイル名①", "ファイルパス\分割したファイル名②", "ファイルパス\分割したファイル名③" | ForEach-Object { ;
  $fullPath = Join-Path $PWD $_ ;
  $bytes = [System.IO.File]::ReadAllBytes($fullPath);
  $target.Write($bytes, 0, $bytes.Length) } ;

#最後に必ず閉じる
$target.Close()

結合するのに少々時間が掛かります。
成功するとファイルが出来ます

コマンドプロンプトで実行

コマンドプロンプトでもできます

copy /b "ファイルパス\分割したファイル名.part1" + "ファイルパス\分割したファイル名.part2" + "ファイルパス\分割したファイル名.part3" "ファイルパス\結合後のファイル名"

こっちも同じくファイルがあフォルダへ移動して実行します
コマンドプロンプトではサイズが大きくても警告は出ないですね

コメント

タイトルとURLをコピーしました