SmartCopy v0.3.1
Windows ファイルのコピー・移動

中断しても再開、
消す前に 検証する.

エクスプローラーのコピーは途中で切れると、どこまで進んだか教えてくれません。SmartCopy は作業をキューに入れて一時停止・再開でき、コピーを検証したあとではじめて移動元を削除します。USB を抜いても、NAS が切れても、再起動しても進捗は残ります。

インストール不要 · 管理者権限不要 · Windows 10 / 11 (64 ビット)

実際の画面構成 · サンプルデータ
SmartCopy v0.3.1 管理コンソールログ─ □ ✕
D:\写真 2024
D:\カメラ元データ
コピー先
E:\バックアップ
動作
コピー移動
検証
SHA-256
作業を開始
写真 2024 → バックアップ 実行中
12,481 / 20,004 ファイル 14.2 GB / 22.8 GB 186 MB/s 残り時間 00:47

成功 12,481 · スキップ 0 · 失敗 0 · 残り 8.6 GB

D:\写真 2024\2024-07\IMG_4821.ARW

一時停止 中止
プロジェクト保管 → NAS 再接続待ち
3,902 / 6,110 ファイル 41.0 GB / 64.3 GB 一時停止中

デバイスが切断されました — つなぎ直せば続きから進みます (WinError 64)

請求書 → 保管庫 完了
412 / 412 ファイル SHA-256 検証に合格
移動の順序

元は最後に消します

移動は三つの段階です。前が終わってから次へ進みます。

段階 1

コピー

コピー先に .scpart 一時ファイルとして書きます。書き終わってから最終的な名前に変えるので、途中で止まっても半分だけ書かれたファイルが正常なファイルに見えることはありません。

段階 2

検証

サイズと更新時刻を突き合わせ、必要なら SHA-256 まで比べます。食い違えばその複製を消してもう一度コピーします。

段階 3

元の削除

検証を通ったファイルだけ元を消します。スキップしたファイルの元はそのまま残り、空のフォルダーは最後に片づけます。

同じドライブ内の移動は実際に運ばず、名前を変えるだけです — 速く、中間状態そのものが生じません。上の三段階は別のドライブへ移るときだけです。

同じ名前が既にあるとき

六つの衝突ポリシー

作業を作るときに決めておくことも、その都度たずねさせることもできます。たずねる設定にするとダイアログで 以降の衝突にも同じ選択を適用を選べます。

ポリシーすることこんなとき
overwriteコピー先を上書きします元が常に最新の片方向バックアップ
skipスキップして元をそのままにします足りない分だけ埋めるとき
rename名前 (1).拡張子として新しく作ります両方残す必要があるとき (既定)
keep_newer更新時刻が新しい方を残します両方で編集したフォルダーを合わせるとき
keep_largerサイズが大きい方を残します切れて保存されたファイルが混じっているとき
ask両方の大きさ・時刻を見せてたずねます一件ずつ判断したいとき
中断 · 取り外し · 電源障害

止まった場所を覚えています

進捗は画面の中だけにあるのではなく、ディスクに残ります。だからアプリを閉じても、電源が落ちても、最初からやり直しにはなりません。

作業ジャーナル

終わったファイルを一行ずつ書き足します。書き足すだけなので、電源が落ちても壊れるのは最後の一行までで、その行だけ捨てます。

  • もう一度実行すると、終わったファイルは飛ばします
  • 成功で終わった作業のジャーナルは自分で消します
  • 起動時に未完了の作業を見つけ、続けるかたずねます

%LOCALAPPDATA%\SmartCopy\jobs\

ファイル一つの中での再開

大きいファイルは .scpartにどこまで書いたかがそのまま残ります。隣に置いたメタファイルで元の大きさ・更新時刻が変わっていないか確かめてから、はじめて再開します。

  • 元が変わっていれば再開せず最初から
  • 他の作業が残した中間ファイルはその場で片づけます

USB の取り外し · NAS の切断

デバイスが消えても失敗にはせず、 再接続待ち 状態で止まります。つなぎ直せば中断した地点から続けます。

WinError 21 · 53 · 59 · 64 · 1167

失敗したファイルだけもう一度

他のプログラムがロックしたファイルのような一時的な不具合は 0.5 秒 → 2 秒 → 5 秒の間隔で自動的に再試行します。それでもだめなら失敗一覧に残り、 再試行 ボタンでその分だけ回し直します — フォルダー構成はそのままで。

人がいないとき

一度設定すれば自分で動きます

毎回同じ操作を手で押しているなら、それはプログラムの仕事です。

監視フォルダー

フォルダーにファイルが入って落ち着くと、保存した作業を実行します。書き込み中のファイルには手を出しません — 変化が止まるまで待ちます。

smartcopy-cli watch "納品" --folder D:\カード取込

タスク スケジューラ

毎日午前3時、あるいはログオン時に。管理者権限なしで登録でき、Windows のタスク スケジューラ画面からそのまま削除できます。

smartcopy-cli schedule --install "週次バックアップ" --when daily --at 03:00

エクスプローラーの右クリック

フォルダーを右クリックすると、作っておいた作業の名前が出ます。選ぶと画面がその設定で埋まり、開始は人が押します。

証明書が互いを裏づけます

証明書は一枚なら簡単に捨てられます。だから各証明書が前の証明書のハッシュを抱えます — 途中の一枚を抜くと連鎖が切れます。

smartcopy-cli ledger --verify

タイムスタンプ機関ではありません。防ぐのは、十回納品して気に入った九回だけを見せることです。

10 万個入れても

キューが順序を決めます

扱うもの方式
チャンクの大きさ媒体を見て決めます — 固定ディスク 4 MB、USB 1 MB、ネットワーク 256 KB。一時停止・中止はチャンクの境目で効くので、やみくもに大きくはしません。
同時に動く作業既定は 2 件。同じディスクを複数の作業が同時にたたくと全体が遅くなるからです。
優先度作業ごとに優先度を持ち、高いものから出します。同じなら入れた順に。
大量の列挙scandir を使って走査し、シンボリックリンクやジャンクションは追わないので循環コピーに陥りません。
長いパス · ユニコード260 文字の制限を回避するパス接頭辞を付けて扱います。ユニコードの名前はそのまま。
進捗の更新0.2 秒に一度にまとめます — 10 万個で画面の更新がコピーより高くつかないように。
同時のファイル数一つの作業の中でファイルを同時に複数コピーします(最大 16)。小さいファイルが多いときや NAS で効果が大きいです。
速度制限秒あたりのバイト上限。バックアップを回しながら会議をしなければならないときに。ワーカーは同じバケットを共有します。
絞り込み含める/除くパターン、フォルダーごとの除外、大きさ・日付の範囲、隠しファイルの除外。
プレビュー何も書かずに、何が移るかだけ計算します。
開始前の点検コピー先の空き容量、コピー先が元の下にないか、保護された経路ではないか、元が存在するかを先に確かめます。

robocopy より遅いです。 ファイルごとに再開情報を残し、コピーしたものを検証し、ジャーナルに書くからです — その三つがこのプログラムの存在理由です。 内蔵 SSD では小さなファイルで 5〜15 倍、大きなファイルで 7 倍ほど遅くなります。測った数字と測り方はリポジトリにそのまま置いてあります。

複数の作業を一か所で

管理コンソール

ウィンドウが「いま運んでいるもの」なら、コンソールは全体です。キュー・履歴・復旧・ログ・整合性チェックが一画面に。 smartcopy-cli admin またはウィンドウ UI の 管理コンソール ボタンで開きます。

見えるもの

  • 進行バナー — 複数作業の合計進捗・速度・残り時間
  • 作業カード — 状態チップ、進捗、成功/同一/スキップ/失敗
  • 作業の詳細 — 失敗の一覧と理由、警告、平均速度
  • 復旧 — 中断した作業を選んで続けるか捨てる
  • 整合性チェック — マニフェストでコピー先がそのままか照合

操作できるもの

  • 新しい作業 — 経路を選ぶ窓、絞り込み、性能の設定
  • 開始前の点検 — 保護された経路・空き容量を先に知らせます
  • 一時停止 / 再開 / 中止 / 失敗分の再試行 (個別・全体)
  • 同時に動かす作業の数を調節

コンソールは 127.0.0.1 だけに 開き、実行のたびに作り直すトークンがなければ入れません。外部のドメインがこのアドレスを指すようにする手口(DNS リバインディング)は Host 検査で、他のサイトがブラウザに送らせる要求は Origin 検査で止めます。

窓なしで

コマンドラインでも同じエンジン

バッチファイルやタスクスケジューラには smartcopy-cli.exeを使います。

# フォルダーをコピー + SHA-256 で検証 > smartcopy-cli copy "D:\写真 2024" E:\バックアップ --verify hash [running] [################----] 83.3% 14.2 GB/22.8 GB 186 MB/s ETA 00:47 # 移動 — 同じ名前があれば新しい名前で > smartcopy-cli move C:\保管 E:\倉庫 --conflict rename # 中断した作業を確認して続ける > smartcopy-cli recover > smartcopy-cli recover --resume # 以前コピーした結果を後から照合 > smartcopy-cli verify D:\元 E:\バックアップ\元 --level hash # エクスプローラーのメニューを登録 (現在のユーザー、管理者権限不要) > smartcopy-cli shell --install
ダウンロード

どちらもインストール不要です

設定とログは %LOCALAPPDATA%\SmartCopy の下にだけ書きます。

ウィンドウ UI

SmartCopy.exe

ドラッグ&ドロップで入れ、作業カードで進み具合を見ます。エクスプローラーの右クリックメニューもこのファイルを呼びます。

13.6 MB · SHA-256 2e1f9b91034f8cea14cf6d2236741b7a165b25ebaf364e1b9a7d203578892197

ダウンロード

コマンドライン

smartcopy-cli.exe

copy · move · recover · verify · shell。スクリプトやスケジューラ向きです。

13.6 MB · SHA-256 d3f8f003b8d1f2b22faf621b5b1531c73a6e456315124e609be43b9e55d53c96

ダウンロード

エクスプローラー右クリック連携

ファイルやフォルダーを右クリックして SmartCopy に追加、移し先のフォルダーでは SmartCopy のコピー先に設定。何回かに分けて入れても一つの窓にまとまります。

登録は HKEY_CURRENT_USER の下だけ — 解除は shell --uninstall 一回

必要なもの

  • Windows 10 / 11 (64 ビット)
  • 管理者権限は不要
  • SMB · NAS · USB · リムーバブルディスクに対応
  • ソースから動かすには Python 3.9 以上 (標準ライブラリのみ)