「ファイル履歴」の致命的な不具合
Windows 10の公式バックアップ「ファイル履歴」には致命的とも言える不具合があります。
同一フォルダに全角と半角、平仮名と片仮名で同名のファイルがあると対象ファイルだけでなくバックアップ全体が停止してしまうんですね。
↓ 例えばこんな組み合わせ
HOGE.txt
HOGE.txt
うぬ.jpg
ウヌ.jpg
!.mp4
!.mp4
資料1.doc
資料1.doc
細かい事は日経の記事が参考になります。
バックアップに失敗してもログに簡単なエラーが記録されるだけで特に通知はありません。
具体的な原因は何も教えてくれないのでバックアップ対象の無数のファイル群から自力で原因を探し出さなくてはならず……って普通キレますよね? 僕はガチギレしましたw
またパス名が長すぎる場合もやはりバックアップ全体が停止してしまいます。
こちらも特に通知はありませんが原因となったファイル名がログに記録してくれるので若干マシかもしれません。
これらの不具合はシングルバイト言語圏の方々には特に重大な問題ではないらしく、Windows 8の頃から放置されています。Windows 11でも多分直らなさそう。
「ファイル履歴」のエラーを通知する
「ファイル履歴」は不具合さえ無ければとても便利なツールなんですが、いつの間にか停止しているバックアップなんて怖くて使えないです。
でも逆に言えば次の機能さえあれば実用できるハズです。
- バックアップの失敗を通知する
- 失敗したファイルを特定する
失敗の通知に関してはとても簡単に実現できます。
イベントビューアーで “Microsoft-Windows-FileHistory-Engine/BackupLog” を開き、「このログにタスクを設定」をクリックすると、実行ファイルやスクリプトを設定できるのでこれを利用します。
単純にエラーログが書き込まれたタイミングでタスクを起動するだけなので、たとえ未知のエラーでバックアップが停止してもエラー通知が届くハズです。
(ログも吐かずに停止してしまうような不具合が存在しなければですが)
「ファイル履歴」のエラー原因を検出する
通知だけならスクリプトで十分ですが、エラー原因の検索もしたいので今回はC#(WinForms+.NET Core 3.1)を採用します。
起動したらエラーの原因になりそうなファイルを検索しつつタスクトレイで待機します。
失敗しそうなファイルを検索する処理はこんな感じ。
var list = new HashSet<string>();
var path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
var enumerationOptions = new EnumerationOptions();
enumerationOptions.RecurseSubdirectories = true;
var files = Directory.GetFileSystemEntries(path, "*", enumerationOptions);
foreach (var file in files)
{
var file1 = Strings.StrConv(file, VbStrConv.Wide);
file1 = Strings.StrConv(file1, VbStrConv.Uppercase);
file1 = Strings.StrConv(file1, VbStrConv.Hiragana);
if (list.Contains(file1))
{
Invoke(new AddItemDelegate(AddItem), file);
}
else
{
list.Add(file1);
if (file.Length >= 250)
{
Invoke(new AddItemDelegate(AddItem), file);
}
}
}
対象フォルダのファイルやフォルダを全角化、大文字化、平仮名化しつつリスト化します。
同名のファイル名や長いファイル名を見つけたらListViewに放り込むだけ。
「ファイル履歴」の「簡易」チェッカー
というけで作成した成果物はGitHubにあります。
直接起動しても不具合ファイルの検索ツールとして使えますが、イベントビューアーで "Microsoft-Windows-FileHistory-Engine/BackupLog"を開き、「このログにタスクを設定」をクリックして"CheckFileHistory.exe"を設定するとエラー通知が届いていい感じになります。
[ログ]メニューでイベントビューアーの該当ログが開きますので、そこから設定可。
ファイルのリストをダブルクリックすると、エクスプローラーで対象ファイルがあるフォルダが開きますので、名前を修正するなり削除するなりしてください。
「簡易」チェッカーという名称はチェック対象がユーザーフォルダ(C:\Users[ユーザー名])固定なためです(手抜き)
自分の利用範囲ではこれで十分実用的なので、これ以上の改良は他の方に任せます:-)
"[ユーザーフォルダ]\AppData\Local\Microsoft\Windows\FileHistoryy\Configuration"あたりにファイル履歴の設定ファイルがあるのでここらへんを調べればなんとかなりそう?
……けど何故か設定ファイルが2組あるし???ってなって面倒くさくなったw