Дата:   18.11.2017 г.
Время:
 
 
Профессионалам и любителям
ПРОСТО * ДОСТУПНО * ИНТЕРЕСНО
01796
Подписной
индекс
Опрос
Пользуетесь домашней сетью?
Погода
 
Архив - Windows: Лечим глючные файлы NTFS - Журнал «Компьютер»
Windows: Лечим глючные файлы NTFS
№ 1-2'2009     Владислав Демьянишин   сайт автора    Тема: Система     ( Прочитано 8495 раз )
 
В эпоху операционной системы MS-DOS и файловой системы FAT16 существовали жёсткие ограничения составления имён файлов. Так, максимальная длина имён файла не должна была превышать 8 символов, а расширения – 3 символов.
С выходом Windows 95 максимальная длина имени файла увеличилась до 255 символов, и с тех пор нам не приходится гадать, что скрывается в файле с названием MARIOB~1.RAR. В новых файловых системах FAT32 и NTFS с тех времён остались другие, менее заметные, но всё же ограничения.
 
Запретные символы
 
Так называемые Filename Conventions («Соглашения об именах файлов») содержат правила, определяющие имена файлов. Данный документ указывает, какие символы допустимо использовать в названиях файлов, какие символы являются разделителями пути, определена максимальная длина пути и т.д.
Здесь же оговариваются ограничения. Например, символы “”, “/”, “?”, “|”, “*”,“<”, “>” и “:” имеют специальное значение в Windows при операциях с файлами, в частности, из командной строки, и поэтому не могут быть использованы в имени отдельного файла.
По-видимому, это ограничение обойти невозможно, поскольку при обращении к системным функциям для работы с файлами, Windows замечает их среди других символов и интерпретирует по-своему.
Следует обратить внимание на специфическое использование символов точки “.”, двоеточия “:” и пробела. Символ пробела может встречаться в имени файла или каталога. Точка используется как разделитель имени файла от расширения. Двоеточие – это разделитель между буквой диска и остальной частью пути. Использование двоеточия не допускается нигде, кроме как после буквы диска.
Исключением является файловая система NTFS, где двоеточие используется ещё и в качестве разделителя между нормальным именем файла и прикреплёнными к нему файловыми потоками. Точка и пробел могут стоять в любом месте имени, но не могут быть завершающими символами.
Такое странное, на первый взгляд, ограничение существует, как объясняет Microsoft, ради совместимости новых файловых систем со старыми, такими как HPFS, используемой в OS/2 и FAT16. Я считаю, что это ограничение частично связано с двумя существующими виртуальными файловыми объектами (так называемые «точки»).
При работе с файловыми менеджерами вроде Total Commander, для перехода в предыдущую папку надо щёлкнуть по каталогу с названием “..” (две точки). В файловых системах так обозначается родительский каталог относительно текущего пути, а текущая папка обозначается как “.” (одна точка).
Честно говоря, эти объекты не являются настоящими файлами или каталогами. Это просто абстрактные объекты, используемые по традиции для навигации между папками.
В Windows Explorer (Проводник) они вообще не показываются. Поскольку пользователь может создавать файлы, имена которых начинаются с точки (но не в Windows Explorer), то Microsoft заблокировала возможность ставить точки в конце названия, чтобы было невозможно создать файл “..”. Аналогично заблокирован в конце имени и пробел.
 
Обходим ограничения
 
На сегодня известны два наиболее удобных способа обхода описанных ограничений. Принцип их действия сводится к составлению названия файла определённым образом, после чего оно передаётся некоторой системной функции для работы с файлами.
В результате этого алгоритм проверки параметра на корректность не срабатывает, и мы получаем нужный результат – создаётся файл или каталог (папка) с корявым названием для системы или наоборот, получаем возможность получить доступ к уже существующему файлу с корявым названием.
 
Способ первый
 
Заключается в использовании UNC-путей (Universal Naming Convention – Универсальное соглашение об именах). Это формат для записи пути к файлу, расположенному на удалённом компьютере.
Он имеет формат: “serversharepath”, где server – это имя сервера, share – расшаренный ресурс на нём, а далее следует путь к файлу в обычном формате. Данный способ доступа к файлам можно применять и для локальной машины, только в этом случае вместо “server” следует подставить “?” (знак вопроса) или “.” (точка), а путь к файлу указать вместе с буквой диска. Например, так: “?C:Downloadsfile.txt”.
 
 
 
 
Это, пожалуй, самый простой и удобный способ. Разберём его на примере удаления файла с некорректным названием “CABM909J.”, который образовался у меня в момент скачивания прикреплённого к письму DOC-файла с именем на украинском языке, и который система не правильно поняла.
С тех самых пор никакими средствами удалить этот файл нельзя. Ни Проводник, ни Total Commander, ни командная строка справиться с ним не в состоянии. При этом файл якобы занимает 0 байт и не может быть открыт.
Выяснилось, что в командной строке этот способ не действует, а вот при использовании стандартных системных команд (API), например, из среды разработки программ Delphi всё успешно работает.
Итак, весь фокус в том, что вместо обычного локального имени файла или полного пути необходимо указывать полный путь, предваряя его комбинацией “?” (что предпочтительнее) или “.”. Получится, приблизительно следующее: “?c:DownloadsCABM909J.”
Далее можно работать с файлом как обычно, т.е. можно писать в него, читать из него, копировать, удалять и делать всё остальное, используя стандартные функции. Надо лишь не забывать, что везде, где требуется указание имени файла, необходимо указывать полный путь с UNC-префиксом.
При тестировании выяснилось, что использование префикса “?” более надёжно, чем “.”. При использовании второго префикса, к примеру, можно потерпеть неудачу при попытке удаления файла.
Итак, если вы знакомы с программированием на Delphi, то строка удаления файла может выглядеть следующим образом:
 
DeleteFile(‘?C:DownloadsCABM909J.’);
 
Мою программу под названием NTFS fixer, позволяющую удалять такие некорректные файлы, можно скачать на сайте http://amonit.sulfurzona.com в разделе «Софт».
 
Способ второй
 
Заключается в подстановке постфикса “.” в конце имени. Аналогично позволяет совершать манипуляции с файлами и папками, с тем лишь отличием, что специальную комбинацию символов “.” следует ставить не в начале пути, а в конце, сразу за именем.
Данный способ применим и к папкам при использовании стандартных команд CopyFile, MoveFile, MkDir, RmDir и некоторых других. В командной строке данный способ можно применять только к каталогам. Так, например, если необходимо, можно создать папку с нестандартным именем “.HELLO.” (в начале и в конце имени точка) командой:
 
mkdir .HELLO..
 
После этого удалить папку обычным способом через файловый менеджер или командную строку не получится:
 
C:Proba>rd .hello.
Не удается найти указанный файл.
 
Windows: Лечим глючные файлы NTFS 
Рис. 1
 
Для успешного удаления такой папки необходимо команду тоже дополнить постфиксом (см. рис. 1):
 
C:Proba>rd .hello..
 
Бдительность не помешает
 
Дело усугубляется тем, что такой способ могут использовать и сомнительные личности, занимающиеся написанием вирусов или просто вредители. Создав папку или файл с некорректным названием, злоумышленник создаёт область, совершенно не доступную неосведомлённому пользователю, и может скрыть в ней что угодно и делать с ней что захочет.
Средствами Windows невозможно узнать список файлов из такой папки, и тем самым получается защита не хуже архива с паролем! Следует отметить, что программа scandisk и другие подобные ей утилиты почему-то не видят ничего странного в файлах с такими именами и даже не пытаются исправить их.
Но после прочтения этой статьи, думаю, вы получите ещё один эффективный инструмент в борьбе с глюками и вирусами.
 

 
 
На главную страницу На предыдущую страницу На начало страницы
 
 
 
 
 
2009 - 2017 © СПД Зайцев А.Б.
Сайт является средством массовой информации.
При перепечатке и цитировании в печатных СМИ ссылка на журнал "Компьютер" обязательна.
При перепечатке и цитировании в Интернете обязательна активная гиперссылка на сайт Comput.com.ua, не закрытая для индексирования.
Украина онлайн Рейтинг@Mail.ru Рейтинг Сайтов YandeG