根がヒツコイ人間なのか、まだ「ファイルのプロパティダイアログの作成日時をコピーすると、年月日の数字の前後に'?'(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は受け付けるのでしょうか?

 

(ひょっとしてこの謎を解いたら、また書きます。)