Почему IO.DirectoryInfo.FullName прерывается, когда путь заканчивается на «\ CON»?

1

Я использую IO.DirectoryInfo для дезинфекции пути. Однако, похоже, это странное поведение, когда путь заканчивается на "\ CON". Например:

IO.DirectoryInfo("C:\FOOBAR\").FullName

Вернется:

C:\FOOBAR\

Однако в этих примерах:

IO.DirectoryInfo("C:\CON").FullName
IO.DirectoryInfo("C:\SUB\CON").FullName
IO.DirectoryInfo("..\CON").FullName
IO.DirectoryInfo("CON").FullName

Возвращаемое значение всегда:

\\.\CON

Итак, когда пользователь хочет создать каталог под названием "CON", вся программа взрывается.

Из всех странных вещей, которые я видел.Net Framework в прошлом, это берет торт. Может ли кто-нибудь объяснить, что здесь происходит?

Теги:

2 ответа

5
Лучший ответ

CON - зарезервированное имя файла с длинной историей в качестве имени устройства MS-DOS. Как указано в документации по именованию файлов, путей и пространств имен:

Не используйте следующие зарезервированные имена для имени файла: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Также избегайте этих имен, за которыми следует сразу расширение; например, NUL.txt не рекомендуется.

См. Https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx.

  • 0
    Спасибо за разъяснение этого. Таким образом, NTFS / FAT32 имеет не только список зарезервированных символов для имен файлов / каталогов, но и список зарезервированных строк. Я могу использовать System.IO.Path.GetInvalidFileNameChars () и System.IO.Path.GetInvalidPathChars () для проверки зарезервированных символов. Я предполагаю, что следующий очевидный вопрос состоит в том, как лучше всего проверить эти недопустимые имена и более аккуратно сообщить пользователю об их ошибке. Похоже, что это плохо обрабатывается и на уровне ОС. Я могу запустить "MKDIR CON \" из командной строки. Каталог создается, но в него невозможно войти. Тьфу.
4

Я подозреваю это, потому что CON - это удержание от DOS. В DOS CON есть специальный файл, относящийся к CONSOLE, поэтому вы можете сделать это в командной строке cmd:

COPY CON FILENAME
  1. Теперь введите все, что угодно, в файл с именем FILENAME, т.е. "Вот пример текста".

  2. Завершите работу с конечным файлом DOS (Control-Z).

Теперь вы ввели прямо в файл с именем FILENAME из CON (подошвы). Чтобы просмотреть введенные вами данные, введите type FILENAME. Вы увидите все, что вы набрали.

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

  • 0
    Ух ты. Это интересный хак. Я всегда просто передавал команду "echo" в файл, чтобы сделать это. Я предполагаю, что этот путь позволил бы возврат каретки
  • 1
    Да, это забавная часть древней истории.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню