Нельзя удалить файл или папку в томе файловой системы NTFS

В этой статье описывается, почему нельзя удалить файл или папку в томе файловой системы NTFS. Он также предоставляет помощь в решении этой проблемы.

Применяется к:   Windows Server 2012 R2
Исходный номер КБ:   320081

Примечание

Внутренне NTFS рассматривает папки как особый тип файла. Таким образом, файл слова в этой статье указывает файл или папку.

Причина 1. Файл использует ACL

Вы не можете удалить файл, если в файле используется список управления доступом (ACL). Чтобы устранить эту проблему, измените разрешения в файле. Возможно, вам придется взять на себя ответственность за файлы, чтобы изменить разрешения.

Администраторы имеют неявную возможность заботиться о любом файле, даже если ему явно не было предоставлено никаких разрешений. Владельцы файлов имеют неявную возможность изменять разрешения файлов, даже если им явно не выданы разрешения на файл. Таким образом, возможно, вам придется взять на себя ответственность за файл, дать себе разрешения на удаление файла, а затем удалить файл.

Вы не можете использовать определенные средства безопасности для отображения или изменения разрешений, так как файл имеет неканонический ACL

Чтобы решить эту проблему, используйте другой инструмент (например, более позднее построение Cacls.exe).

Записи управления доступом (ACEs) в ACL имеют определенную предпочтительные последовательности в зависимости от их типа. Например, acEs, которые отказывают в доступе, как правило, приходят перед acEs, которые предоставляет доступ. Однако ничто не мешает программе написать ACL, который имеет acEs в любой произвольной последовательности. В некоторых более ранних версиях Windows проблемы произошли, когда Windows пытались прочитать эти неканонические acLs. Иногда вы не можете изменить эти ALS правильно с помощью графического редактора безопасности Microsoft Windows Explorer. Эта проблема исправлена в более поздних версиях Windows. Если вы испытываете эту проблему, воспользуйтесь последней версией Cacls.exe. Даже если вы не можете отобразить или изменить ACL на месте, вы можете написать новый ACL, чтобы получить доступ к файлу.

Причина 2. Используется файл

Если файл используется, удалить файл нельзя. Чтобы устранить эту проблему, определите процесс с открытой ручкой и закрой этот процесс.

В зависимости от того, как открывается файл, возможно, вы не сможете удалить файл, который используется. Например, файл открыт для эксклюзивного доступа, а не общего доступа. Вы можете использовать различные средства для определения процессов с открытыми ручками для файлов при любой возможности.

Симптомы этой проблемы могут отличаться. Для удаления файла можно использовать команду Delete. Но файл не удаляется до тех пор, пока процесс с открытым файлом не выпустит файл. Кроме того, вы не сможете получить доступ к диалоговом окне Security для файла, который находится в ожидании удаления. Чтобы устранить эту проблему, определите процесс с открытой ручкой и закрой этот процесс.

Причина 3. Коррупция файловой системы препятствует доступу к файлу

Вы не можете удалить файл, если файловая система повреждена. Чтобы устранить эту проблему, запустите утилиту Chkdsk на томе диска, чтобы устранить ошибки.

Следующие причины могут повредить файловую систему и поместить файлы в проблемное состояние:

  • Плохие сектора на диске
  • Другое неисправное оборудование
  • Ошибки программного обеспечения

Типичные операции могут по-разному сбой. Когда файловая система обнаруживает коррупцию, она записывает событие в журнал событий, и обычно вы получаете сообщение, которое побуждает вас к запуску Chkdsk. В зависимости от характера повреждения chkdsk может или не может восстанавливать данные файлов. Однако Chkdsk возвращает файловую систему в внутренне согласованное состояние.

Причина 4. Файлы существуют в путях, которые имеют более глубокие MAX_PATH символов

Вы не можете открыть, изменить или удалить файл, если есть проблемы с пути файла.

Разрешение 1. Для доступа к файлу используйте автогенерированное имя 8.3

Чтобы устранить эту проблему, может потребоваться использовать автогенерированное имя 8.3 для доступа к файлу. Это решение может быть самым простым решением, если путь глубокий, так как имена папок слишком длинные. Если путь 8.3 также слишком длинный или если имена 8.3 отключены в томе, перейдите к разрешению 2. Дополнительные сведения об отключении имен файлов 8.3 в томах NTFS см. в разделах How to disable the 8.3 name creation on NTFS partitions.

Разрешение 2. Переименование или перемещение глубокой папки

Переименуем папку так, чтобы целевые файлы, которые находятся глубже, чем MAX_PATH те, которые больше не существуют. Если вы это сделаете, начните с корневой папки или любого другого удобного места. Затем переименуем папки, чтобы у них были более короткие имена. Если этот шаг не решает эту проблему, например, если файл имеет более 128 папок, перейдите к разрешению 4.

Разрешение 3. Соберите диск с папкой в структуре пути

Соберите диск в папку внутри структуры пути целевого файла или папки. Этот метод сокращает виртуальный путь.

Например, предположим, что у вас есть путь, который структурирован следующим образом:

\\ServerName\SubfolderName1\SubfolderName2\SubfolderName3\SubfolderName4\...

На этом пути общее число символов составляет более 255 символов. Чтобы ухудмить длину этого пути, до 73 символов, соберите диск в SubfolderName4.

Разрешение 4. Использование сетевой доли, которая является такой же глубокой, как папка

Если решения 1, 2 и 3 не удобны или не устраняют проблему, создайте сеть, которая будет расположена в дереве папок так глубоко, как только сможете. Затем переименуем папки, чтобы получить доступ к этой папке.

Разрешение 5. Используйте средство, которое может пересекать глубокие пути

Многие Windows ожидают, что максимальная длина пути будет меньше 255 символов. Эти программы выделяют достаточно внутреннего хранилища для обработки этих типичных путей. NTFS не имеет этого ограничения, и он может держать гораздо более длинные пути.

Эта проблема может возникнуть, если в какой-то момент в структуре папки создается доля, которая уже достаточно глубока, а затем создается глубокая структура ниже этой точки с помощью этой доли. Некоторые средства, которые работают локально на дереве папок, могут не пройти через целое дерево, начиная с корневого. Возможно, вам придется использовать эти средства особым образом, чтобы они могли пересекать долю. Документация по API CreateFile описывает метод обхода всего дерева в этой ситуации.

Как правило, вы можете управлять файлами с помощью программного обеспечения, которое их создает. Если у вас есть программа, которая может создавать файлы с более глубокими глубинами, вы обычно можете использовать эту же программу для удаления или MAX_PATH управления файлами. Как правило, можно удалить файлы, созданные на совместной основе с помощью одной и той же доли.

Причина 5. Имя файла содержит зарезервированное имя в пространстве имен Win32

Если имя файла содержит зарезервированное имя в пространстве имен Win32, например lpt1, удалить файл нельзя. Чтобы устранить эту проблему, используйте программу non-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>"

Причина этой проблемы аналогична причине 4. Если вы используете типичный синтаксис Win32, чтобы открыть файл, в названии которого есть пробелы или периоды отстающих, то перед открытием фактического файла зоны или периоды срезаются. Например, у вас есть два файла в одной папке с именем и , обратите внимание на пространство AFile.txt AFile.txt после имени файла. Если вы пытаетесь открыть второй файл с помощью стандартных вызовов Win32, вы откроете первый файл. Аналогичным образом, если у вас есть файл, имя которого — просто символ пространства, и вы пытаетесь открыть его с помощью стандартных вызовов Win32, вместо этого откройте родительную папку файла. В этой ситуации, если вы пытаетесь изменить параметры безопасности этих файлов, вы либо не сможете сделать это, либо вы можете неожиданно изменить параметры на различных файлах. Если такое поведение происходит, вы можете думать, что у вас есть разрешение на файл, который фактически имеет ограничительную ACL.

Сочетание причин

Иногда вы можете испытывать комбинации этих причин. Это может сделать процедуру удаления файла более сложной. Например, если вы входите в качестве администратора компьютера, у вас может возникнуть сочетание причин 1 (у вас нет разрешений на удаление файла) и Cause 5 (имя файла содержит следяющий символ, из-за которого доступ к файлу перенаправляется в другой или несущестующий файл), а удалить файл нельзя. Если вы попробуете устранить причину 1, приняв право собственности на файл и добавив разрешения, вы все равно не сможете удалить файл, так как редактор ACL в пользовательском интерфейсе не может получить доступ к соответствующему файлу из-за причины 6.

В этой ситуации можно использовать утилиту Subinacl с коммутатором (эта утилита включена в набор ресурсов) для изменения прав собственности и разрешений на файл, который в противном случае /onlyfile недоступен. Пример:

subinacl /onlyfile "\\?\c:\<path_to_problem_file>" /setowner= domain\administrator /grant= domain\administrator=F

Примечание

Эта команда является одной командной строкой, которая была завернута для чтения.

Эта примерная командная строка изменяет файл, содержащий пространство для стекла, чтобы учетная запись домена\администратора была владельцем файла и эта учетная запись полностью контролировала C:\<path_to_problem_file> файл. Теперь этот файл можно удалить с помощью команды Del с тем же "\\?\" синтаксисом.