根がヒツコイ人間なのか、まだ「ファイルのプロパティダイアログの作成日時をコピーすると、年月日の数字の前後に'?'(ASCII 0x3F)が混入し、そのファイルを扱おうとするとエラーになる」Windowsのバグに引っかかっています。
こういう奴ですね。

実は「プログラムでエラーが出るファイルをどうしてOSは難なく処理できるのだろう?」という疑問を解くべくじたばたやっていました。その手伝いをしてくれたのが前に作ったCommand.exeです。
C:ドライブの下にDummyディレクトリーを作り、その中に「2022年4月11日のフォールダー」(プロパティダイアログ作成日時からコピーしたので'?'が数字の前後に入っていますが、amebaのエディターでは表示されていませんね)を作り、その中に「2022年4月11日のファイル.txt」(これにも'?'が数字の前後に入っています)を作ります。
これをDOS窓(昔のCommand.comを真似たCmd.exe)で確かめます。

ここでも'?'は表示されませんが、""で挟んだ場合、半角一文字分空白があることが分かるでしょうか?(なお、cd ""等のコマンドは手入力ではなく、表示された文字列を画面コピーしています。
これじゃぁ、しょうがない、ということで次はPowerShell(PS)で見てみます。
今度は明確に引数の'?'文字が表示されますが、プロンプトや表示される文字列では' '(半角空白文字)になってしまいます。
ということはよ、この禁則文字を空白文字で与えたら何とかなるのかしら?という浅はかな考えで実験(注)をします。
注:C++のrename関数も、Win32APIのMoveFile関数も受け付けないので開発を中断したFileNameCleanerと、GetLastError関数とFormatMessage関数を使ったErrorMsg関数(Error.hというヘッダーファイルに入れています)を使います。
実験結果は、
(1)オリジナルの'?'の入ったファイルパス名で発生するエラーの場合
→Error Codeは123(ERROR_INVALID_NAME)、「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。」で受け付けてくれません。
(2)オリジナルの'?'の入ったファイルパス名を’ ’(半角スペース)に置き換えた場合
→Error Codeは2(ERROR_FILE_NOT_FOUND)か3(ERROR_PATH_NOT_FOUND)、「指定されたファイルが見つかりません。」「指定されたパスが見つかりません。」でやはり討ち死にです。
では、何故Cmd.exeやPowerShell.exeは受け付けるのでしょうか?
(ひょっとしてこの謎を解いたら、また書きます。)


