NTFS ファイル システム上のファイルまたはフォルダを削除できない


Windows 用のセキュリティ更新プログラムを継続して入手するために、必ず Windows XP Service Pack 3 (SP3) を実行するようにしてください。 詳細については、次のマイクロソフト Web ページを参照してください。 Windows の一部バージョンのサポート終了のお知らせ

はじめに


NTFS ファイル システムを使用するボリュームでファイルまたはフォルダーを削除できない場合があります。この資料では、その原因と、原因に応じた問題の解決方法について説明します。

詳細情報


注: NTFS は、内部では、フォルダーを特別な種類のファイルとして扱います。 したがって、この資料では、"ファイル" という単語はファイルまたはフォルダーのどちらかを指します。

原因 1: ファイルが ACL を使用している

アクセス制御リスト (ACL) を使用しているファイルは削除できない場合があります。 この問題を解決するには、ファイルに対するアクセス許可を変更します。 アクセス許可を変更するにはファイルの所有権を取得する必要がある場合があります。

管理者は、明示的にファイルに対するアクセス許可を付与されていなくても、暗黙的にどのファイルの所有権も取得できます。 ファイル所有者は、明示的にファイルに対するアクセス許可を付与されていなくても、暗黙的にファイルのアクセス許可を変更できます。 したがって、ファイルを削除するには、そのファイルの所有権を取得し、そのファイルを削除するためのアクセス許可を自分に付与する必要がある場合があります。

ファイルに非正規のアクセス制御リスト (ACL) があるため、セキュリティ ツールによっては使用できないものがあり、アクセス許可の表示または変更を行うことができない

この問題を回避するには、他のツールを使用します (新しいビルドの Cacls.exe など)。

ACL のアクセス制御エントリ (ACE) には、その種類に応じて特定の優先順序があります。 たとえば、アクセスを拒否する ACE は、通常、アクセスを付与する ACE の前に使用されます。 しかし、ACE の順序が無作為の ACL をプログラムが書き込むことを阻止するものは何もありません。 以前のバージョンの Windows では、Microsoft Windows がこれらの "非正規の" ACL を読み取ろうとしたときに、問題が発生していました。 Microsoft Windows エクスプローラーのグラフィック形式のセキュリティ エディターを使用して、これらの ACL を正しく変更できない場合がありました。 この問題は、最近のバージョンの Windows では修正されています。 この問題が発生する場合は、最新バージョンの Cacls.exe を使用してください。 使用されている ACL を表示または編集できなくても、ファイルへのアクセスを可能にする ACL を新規作成できます。

原因 2: ファイルが使用中である

使用中のファイルは削除できない場合があります。 この問題を解決するには、開いているハンドルがあるプロセスを特定してから、そのプロセスを終了します。

ファイルがどのように開かれているかによって (共有アクセスではなく排他アクセスで開かれているなど)、使用中のファイルを削除できない場合があります。 ファイルへのハンドルが開いているプロセスを特定するには、さまざまなツールをいつでも使用できます。ファイルへのハンドルが開いているプロセスを特定するために使用できるツールの詳細については、次のサポート技術情報番号をクリックしてください。
 
242131 [HOWTO] ファイルを開いているプロセス一覧の表示方法
 
この問題の現象にはさまざまあります。 [削除] コマンドを使用してファイルを削除することはできますが、このファイルを開いているプロセスが解放するまで、このファイルは実際には削除されません。 さらに、削除が保留されているファイルの [セキュリティ] ダイアログ ボックスにアクセスできない場合があります。 この問題を解決するには、開いているハンドルがあるプロセスを特定してから、そのプロセスを終了します。

原因 3: ファイル システムが壊れているためファイルにアクセスできない

ファイル システムが壊れていると、ファイルを削除できない場合があります。 この問題を解決するには、ディスク ボリューム上で Chkdsk ユーティリティを実行して、エラーを修正します。

ディスク上の不良セクター、その他のハードウェアの問題、またはソフトウェア バグがファイル システムの破損の原因であったり、ファイルを問題のある状態にしている可能性があります。 標準的な操作が、さまざまな形で失敗する可能性があります。 ファイル システムが破損を検出すると、イベント ログにイベントが記録され、通常は Chkdsk を実行するように求めるメッセージが表示されます。 破損の性質に応じて、Chkdsk がファイル データを回復できる場合もあれば、できない場合もありますが、Chkdsk はファイル システムを内部的には整合性のある状態に戻します。 Chkdsk ユーティリティの使用の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
176646 Error Message: The File or Directory Is Corrupt... (英語情報)
 
187941 CHKDSK とその新しいスイッチ /C および /I について
 

原因 4: MAX_PATH の文字制限よりも深いパスにファイルが存在する

ファイル パスに問題があると、ファイルの表示、編集、または削除を行うことができない場合があります。

解決方法 1: 自動生成の 8.3 形式の名前を使用してファイルにアクセスする

この問題を解決するには、自動生成の 8.3 形式の名前を使用してファイルにアクセスすることをお勧めします。 フォルダー名が長すぎるためパスが深い場合は、これが最も簡単な解決方法です。 8.3 形式のパスも長すぎる場合、またはこのボリュームでは 8.3 形式の名前が無効になっている場合は、解決方法 2 に進んでください。 NTFS ボリュームで 8.3 形式のファイル名を無効にする方法の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
121007 NTFS パーティションで 8.3 形式の名前の作成を無効にする方法
 

解決方法 2: 深いフォルダーの名前を変更するか、いフォルダーを移動する

MAX_PATH より深いファイルが存在しなくなるようにフォルダーの名前を変更します。 これを行う場合、ルート フォルダー (または別の適切な場所) から下位のフォルダーに向かって名前を短くしていきます。 この手順でこの問題が解決しない場合は (ファイルがある場所が 128 個のフォルダーより深い場合は、解決方法 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 で予約された名前のチェックをバイパスできる場合があります。 たとえば、Windows XP で Del コマンドを使用する場合、次の特別な構文を使用して完全なパスを指定した "lpt1" という名前のファイルを削除できます。
del \\?\c:\path_to_file\lpt1
Windows NT および Windows 2000 で予約された名前のファイルを削除する方法の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
 
120716 Windows NT で予約された名前のファイルを削除する方法
 
Windows XP で予約された名前のファイルを削除する方法の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
 
315226 Windows XP で予約されている名前の付いたファイルを削除する方法
 
標準的な Win32 CreateFile メカニズムを使用してファイルへのハンドルを開く場合、旧スタイルの DOS デバイスに対して特定のファイル名が予約されています。 下位互換性を確保するため、これらのファイル名は許可されておらず、標準的な Win32 ファイル呼び出しを使用して作成することはできません。 この問題は、NTFS の制限ではありません。

Win32 プログラムを使用して、MAX_PATH よりも深いフォルダーをスキャンする際に使用する方法と同じ方法を使用することで、ファイルが作成 (または削除) されるときに行われる標準的な名前のチェックをバイパスできる場合があります。 また、POSIX ツールの中には、これらの名前のチェックの対象にならないものもあります。

原因 6: Win32 名前空間で無効な名前がファイル名に含まれている

ファイル名に無効な名前が含まれているファイルは削除できない場合があります (ファイル名の末尾にスペースまたはピリオドがある場合や、ファイル名がスペースのみで構成されている場合など)。 この問題を解決するには、このようなファイルを削除するのに適切な内部構文を使用するツールを使用します。 このようなファイルに対して動作するいくつかのツールでは、"\\?\" 構文を使用できます。以下に例を示します。
del "\\?\c:\path_to_file_that contains a trailing space.txt "
この問題の原因は原因 4 に似ています。 ただし、標準的な Win32 構文を使用して、名前の末尾にスペースまたはピリオドがあるファイルを開くと、実際のファイルが開く前に、末尾のスペースまたはピリオドが除去されます。 したがって、1 つのフォルダーに "AFile.txt" という名前のファイルと "AFile.txt " という名前のファイルがある場合に、標準の Win32 呼び出しを使用して "AFile.txt " を開こうとすると、"AFile.txt" が代わりに開きます。 同様に、標準の Win32 呼び出しを使用して、名前が " " (スペース文字) だけのファイルを開こうとすると、そのファイルの親フォルダーが代わりに開きます。 この状況で、これらのファイルのセキュリティ設定を変更しようとすると、これを行うことができないか、予期せず他のファイルの設定を変更する可能性があります。 この動作が発生する場合、実際には制限付き ACL があるファイルに対してアクセス許可を持っているものと考える可能性があります。

複数の原因の組み合わせ

複数の原因が問題を発生させている場合があります。その場合、ファイルを削除する手順がさらに複雑になることがあります。 たとえば、コンピューターの管理者としてログオンする場合、原因 1 (ファイルを削除するためのアクセス許可がない) と原因 5 (ファイル名の末尾の文字によって、ファイルにアクセスすると別のファイルまたは存在しないファイルにリダイレクトされる) の組み合わせによってファイルを削除できない可能性があります。 ファイルの所有権を取得してアクセス許可を追加することにより原因 1 を解決しても、原因 6 によってユーザー インターフェイスの ACL エディターが適切なファイルにアクセスできないため、ファイルを削除できない可能性があります。

この状況では、Subinacl ユーティリティを
/onlyfile スイッチと共に使用して、修正しなければアクセスできないファイルの所有権とアクセス許可を変更することができます (このユーティリティは Resource Kit に含まれています)。以下に例を示します。
subinacl /onlyfile "\\?\c:\path_to_problem_file" /setowner=domain\administrator /grant=domain\administrator=F
注: これは 1 行のコマンドですが、ここでは読みやすさを考慮して改行しています。

このコマンド ラインの例は、末尾にスペースがある C:\path_to_problem_file ファイルを、
Domain\administrator\administrator アカウントが所有者になってフル コントロールを持つように変更します。 これで、このファイルは、Del コマンドで同じ "\\?\" 構文を使用することによって削除できます。