この記事では、NTFS ファイル システム ボリューム上のファイルまたはフォルダーを削除できない理由について説明します。 また、この問題を解決するためのヘルプも提供します。
元の KB 番号: 320081
Note
内部的には、NTFS はフォルダーを特殊な種類のファイルとして扱います。 したがって、この記事の file という単語は、ファイルまたはフォルダーを示します。
原因 1: ファイルで ACL が使用されている
ファイルがアクセス制御リスト (ACL) を使用している場合、ファイルを削除することはできません。 この問題を解決するには、ファイルのアクセス許可を変更します。 アクセス許可を変更するには、ファイルの所有権を取得する必要がある場合があります。
管理者は、ファイルへのアクセス許可が明示的に付与されていない場合でも、ファイルの所有権を取得する暗黙的な機能を持ちます。 ファイル所有者には、ファイルに対するアクセス許可が明示的に付与されていない場合でも、ファイルのアクセス許可を変更する暗黙的な機能があります。 そのため、ファイルの所有権を取得し、ファイルを削除するアクセス許可を自分に付与してから、ファイルを削除する必要がある場合があります。
ファイルに非正規 ACL があるため、特定のセキュリティ ツールを使用してアクセス許可を表示または変更することはできません
この問題を回避するには、別のツール (たとえば、Cacls.exeの後のビルド) を使用します。
ACL のアクセス制御エントリ (ACE) には、その種類に応じて特定の優先シーケンスがあります。 たとえば、アクセスを拒否する ACE は、通常、アクセスを許可する ACE よりも前に来ます。 ただし、任意のシーケンスで ACE を持つ ACL をプログラムが書き込むのを妨げるものは何もありません。 以前のバージョンの Windows では、Windows がこれらの非正規 ACL を読み取ろうとしたときに問題が発生しました。 Microsoft Windows Explorer のグラフィカル セキュリティ エディターを使用して、これらの ACL を正しく変更できない場合があります。 この問題は、新しいバージョンの Windows で修正されました。 この問題が発生した場合は、最新バージョンのCacls.exeを使用してください。 ACL をインプレースで表示または編集できない場合でも、新しい ACL を作成してファイルにアクセスできます。
原因 2: ファイルが使用されています
ファイルが使用されている場合、ファイルを削除することはできません。 この問題を解決するには、ハンドルが開いているプロセスを特定し、そのプロセスを閉じます。
ファイルの開き方によっては、使用中のファイルを削除できない場合があります。 たとえば、ファイルは共有アクセスではなく排他アクセス用に開かれています。 さまざまなツールを使用して、必要に応じてファイルに対してハンドルを開くプロセスを決定できます。
この問題の症状は異なる場合があります。 Delete コマンドを使用すると、ファイルを削除できます。 ただし、ファイルが開かれているプロセスによってファイルが解放されるまで、ファイルは削除されません。 さらに、削除が保留中のファイルの [セキュリティ] ダイアログ ボックスにアクセスできない場合があります。 この問題を解決するには、ハンドルが開いているプロセスを特定し、そのプロセスを閉じます。
原因 3: ファイル システムの破損によってファイルへのアクセスが妨げられる
ファイル システムが破損している場合、ファイルを削除することはできません。 この問題を解決するには、ディスク ボリュームで Chkdsk ユーティリティを実行してエラーを修正します。
次の理由により、ファイル システムが破損し、ファイルが問題のある状態になる可能性があります。
- ディスク上の不良セクター
- その他の障害のあるハードウェア
- ソフトウェアのバグ
一般的な操作は、さまざまな方法で失敗する可能性があります。 ファイル システムが破損を検出すると、イベントがイベント ログに記録され、通常は Chkdsk の実行を求めるメッセージが表示されます。 破損の性質に応じて、Chkdskはファイルデータを回復する場合と回復しない場合があります。 ただし、Chkdsk はファイル システムを内部整合性状態に戻します。
原因 4: MAX_PATH文字より深いパスにファイルが存在する
ファイル パスに問題がある場合は、ファイルを開いたり、編集したり、削除したりすることはできません。
解決策 1: 自動生成された 8.3 名を使用してファイルにアクセスする
この問題を解決するには、自動生成された 8.3 名を使用してファイルにアクセスできます。 フォルダー名が長すぎるため、パスが深い場合は、この解決が最も簡単な解決策である可能性があります。 8.3 パスも長すぎる場合、またはボリュームで 8.3 の名前が無効になっている場合は、 Resolution 2 に移動します。 NTFS ボリュームで 8.3 ファイル名を無効にする方法の詳細については、「 NTFS パーティションでの 8.3 名の作成を無効にする方法を参照してください。
解決策 2: ディープ フォルダーの名前を変更または移動する
フォルダーの名前を変更して、 MAX_PATH
より深いターゲット ファイルが存在しないようにします。 その場合は、ルート フォルダーまたはその他の便利な場所から開始します。 その後、フォルダーの名前を変更して、名前を短くします。 この手順でこの問題が解決しない場合 (たとえば、ファイルの深さが 128 フォルダーを超える場合) は、 Resolution 4 に移動します。
解決策 3: パスの構造内のフォルダーにドライブをマップする
ターゲット ファイルまたはフォルダーのパスの構造内のフォルダーにドライブをマップします。 このメソッドは、仮想パスを短縮します。
たとえば、次のように構成されたパスがあるとします。
\\ServerName\SubfolderName1\SubfolderName2\SubfolderName3\SubfolderName4\...
このパスでは、合計文字数は 255 文字を超えています。 このパスの長さを 73 文字に短縮するには、ドライブを SubfolderName4 にマップします。
解決策 4: フォルダーと同じ深さにあるネットワーク共有を使用する
解決策 1、2、3 が便利ではない場合、または問題が解決しない場合は、フォルダー ツリーの深いネットワーク共有を作成します。 次に、共有にアクセスしてフォルダーの名前を変更します。
解決策 5: ディープ パスを走査できるツールを使用する
多くの Windows プログラムでは、パスの最大長が 255 文字より短いと想定されています。 これらのプログラムは、これらの一般的なパスを処理するのに十分な内部ストレージのみを割り当てます。 NTFS にはこの制限がないため、長いパスを保持できます。
この問題は、フォルダー構造のどこかの時点で既にかなり深い共有を作成し、その時点より下に共有を使用して深い構造を作成する場合に発生する可能性があります。 フォルダー ツリーでローカルに動作する一部のツールでは、ルートからツリー全体を走査できない場合があります。 共有を走査できるように、これらのツールを特別な方法で使用する必要がある場合があります。 CreateFile API のドキュメントでは、この状況でツリー全体を走査するメソッドについて説明します。
通常、ファイルを作成するソフトウェアを使用してファイルを管理できます。 MAX_PATH
より深いファイルを作成できるプログラムがある場合は、通常、同じプログラムを使用してファイルを削除または管理できます。 通常は、同じ共有を使用して共有に作成されたファイルを削除できます。
原因 5: ファイル名に Win32 名前空間に予約名が含まれている
ファイル名に Win32 名前空間に予約名 (lpt1 など) が含まれている場合、ファイルを削除することはできません。 この問題を解決するには、Win32 以外のプログラムを使用してファイルの名前を変更します。 POSIX ツールまたはその他のツールを使用して、適切な内部構文を使用してファイルを使用できます。
また、特定の構文を使用してファイルのパスを指定する場合は、いくつかの組み込みコマンドを使用して、一般的な Win32 予約名チェックをバイパスできます。
一般的な Win32 CreateFile メカニズムを使用してファイルへのハンドルを開くと、特定のファイル名は古い形式の DOS デバイス用に予約されます。 下位互換性のために、これらのファイル名は許可されず、一般的な Win32 ファイル呼び出しを使用して作成することはできません。 この問題は NTFS の制限ではありません。
Win32 プログラムを使用すると、 MAX_PATH
より深いフォルダーを走査するために使用するのと同じ手法を使用して、ファイルの作成時または削除時に実行される一般的な名前チェックをバイパスできます。 さらに、一部の POSIX ツールは、これらの名前チェックの対象になりません。
原因 6: ファイル名に Win32 名前空間に無効な名前が含まれている
ファイル名に無効な名前が含まれている場合、ファイルを削除することはできません。 たとえば、ファイル名に末尾のスペースや末尾のピリオドが含まれている場合や、ファイル名がスペースのみで構成されている場合などです。 この問題を解決するには、適切な内部構文を使用してファイルを削除するツールを使用します。 これらのファイルを操作するために、一部のツールで "\\?\"
構文を使用できます。 次に例を示します。
del "\\?\c:\<path_to_file_that contains a trailing space.txt>"
この問題の原因は、 Cause 4 に似ています。 一般的な Win32 構文を使用して、名前に末尾のスペースまたは末尾のピリオドがあるファイルを開くと、実際のファイルが開かれる前に末尾のスペースまたはピリオドが削除されます。 たとえば、 AFile.txt
と AFile.txt
という名前の同じフォルダーに 2 つのファイルがある場合は、ファイル名の後のスペースをメモします。 標準の Win32 呼び出しを使用して 2 番目のファイルを開こうとすると、代わりに最初のファイルを開きます。 同様に、名前がスペース文字だけのファイルがあり、標準の Win32 呼び出しを使用してファイルを開こうとすると、代わりにファイルの親フォルダーを開きます。 このような状況で、これらのファイルのセキュリティ設定を変更しようとすると、できないか、別のファイルの設定が予期せず変更される可能性があります。 この動作が発生した場合、実際には制限付き ACL を持つファイルに対するアクセス許可があると思われる場合があります。
原因の組み合わせ
場合によっては、これらの原因の組み合わせが発生することがあります。 ファイルを削除する手順をより複雑にすることができます。 たとえば、コンピューターの管理者としてログオンすると、 Cause 1 (ファイルを削除するアクセス許可がありません) と Cause 5 (ファイル名に末尾の文字が含まれており、ファイル アクセスが別のファイルまたは存在しないファイルにリダイレクトされる) が発生する可能性があり、ファイルを削除することはできません。 ファイルの所有権を取得し、アクセス許可を追加して Cause 1 を解決しようとすると、ユーザー インターフェイスの ACL エディターが Cause 6 のために適切なファイルにアクセスできないため、ファイルを削除できない可能性があります。
このような場合は、 /onlyfile
スイッチ (このユーティリティはリソース キットに含まれています) で Subinacl ユーティリティを使用して、アクセスできないファイルの所有権とアクセス許可を変更できます。 次に例を示します。
subinacl /onlyfile "\\?\c:\<path_to_problem_file>" /setowner= domain\administrator /grant= domain\administrator=F
Note
このコマンドは、読みやすくするためにラップされた 1 つのコマンド ラインです。
このサンプル コマンド ラインは、ドメイン管理者アカウントがファイルの所有者であり、このアカウントがファイルを完全に制御できるように、末尾のスペースを含む C:\<path_to_problem_file>
ファイルを変更します。 同じ "\\?\"
構文で Del コマンドを使用して、このファイルを削除できるようになりました。