こんにちは、とある初級インフラエンジニアです。
先日、ファイルサーバーの古いバックアップデータを整理していたところ、「画面上には存在しているのに、削除しようとすると『ファイルが見つかりません』と言われる」という奇妙な現象に遭遇しました。
通常の操作ではどうしても消すことができず、少し調査が必要だったので、備忘録として解決手順を残しておきます。 同じように「幽霊ファイル」に悩まされている方の助けになれば幸いです。
■ 発生した現象
Windows Server上の特定のフォルダ内にあるバックアップファイルを整理中、特定のファイルだけ削除できませんでした。
-
対象ファイル例:
com2.jpg -
エラー内容: エクスプローラーから削除を実行すると、「この項目は見つかりませんでした。項目の場所を確認して再実行してください」と表示される。
ファイルは間違いなくそこにあるのに、Windowsが「ない」と言い張る状態です。
■ 試したこと(NGだった方法)
まずは一般的なトラブルシューティングとして以下を試しましたが、すべて効果がありませんでした。
-
ファイルのリネーム
-
名前を変えてから消そうとしましたが、リネーム時にも同様に「項目が見つかりません」とエラーになり変更不可。
-
-
コマンドプロンプトでの強制削除
-
管理者権限のコマンドプロンプトで
del /fや親フォルダごとの削除を試みましたが、やはりファイルパスを認識してくれません。
-
■ 原因:Windowsの「予約済みデバイス名」
「リネームすらできない」という点から、ファイルシステムやアクセス権の問題ではなく、「ファイル名そのもの」が原因ではないかと疑いました。
調べてみたところ、今回のファイル名に含まれていた com2 という文字列が原因であることが判明しました。
Windows(というよりMS-DOS時代からの仕様)では、以下の文字列は「システム予約語(予約済みデバイス名)」として登録されており、通常のファイル名として使用することができません。
-
CON,PRN,AUX,NUL -
COM1~COM9 -
LPT1~LPT9
今回の場合、何らかのバックアップツールやLinux系OSから持ち込まれたファイルなどが原因で、本来Windowsでは作成できないはずの com2 という名前のファイルが存在してしまっていたようです。これでは通常API経由で操作できないのも納得です。
■ 解決策:UNCパス(\\?\)を使って削除する
解決策は、Windowsのパス制限や解析をバイパスする「\\?\(Win32 File Namespaces)」という特殊なプレフィックスを付けたコマンドを実行することです。
コマンドプロンプト(cmd)を開き、以下の構文でコマンドを実行します。
del "\\?\ドライブ名:\フォルダパス\ファイル名"
例)del "\\?\D:\file\test\com2.jpg"
これを実行したところ、あれだけ消せなかったファイルがあっさりと削除されました。
■ コマンド実行時の注意点
このコマンドを使用する際は、以下の2点に注意してください。
-
必ず「絶対パス(フルパス)」で指定する
-
\\?\を使う場合、相対パス(.\com2.jpgなど)は使用できません。必ずドライブ文字(C:\やD:\)から記述してください。
-
-
パスはダブルクォーテーション
"で囲む-
パスの途中にスペースが含まれている場合(例:
Program Filesなど)にエラーになるのを防ぐため、パス全体を"で囲んでおくのが確実です。
-
■ まとめ
-
「ファイルが見つかりません」で消せないファイルは、ファイル名が予約語(CON, COM1, PRNなど)になっていないか確認する。
-
予約語ファイルは通常操作では消せない。
-
del "\\?\絶対パス"コマンドで強制的に削除が可能。
バックアップ運用や、異なるOS間でのファイル転送を行っていると、稀にこういった「Windowsの仕様外」のファイルが紛れ込むことがあります。焦らずコマンドで対処しましょう。