none
Преобразование ссылки на папку в физический путь RRS feed

  • Вопрос

  • Подскажите как правильно работать на языке C# с папками ссылками.

    С помощью DirectoryInfo и GetDirectories можно получить список папок в каталоге. При вызове для папки "с:\" мы получаем среди прочих "папку-ссылку", которой не существует в реальности, например: "Documents and Settings". Как для такой "папки-ссылки" получить реальный путь.

    Подскажите, где чего почитать, чтоб не писать бредовое слово "папка-ссылка" и правильно такие ссылки обрабатывать?

    30 января 2020 г. 12:19

Ответы

  • "С помощью DirectoryInfo и GetDirectories можно получить список папок в каталоге. При вызове для папки "с:\" мы получаем среди прочих "папку-ссылку", которой не существует в реальности, например: "Documents and Settings". Как для такой "папки-ссылки" получить реальный путь."

    Конкретно Documents and Settings - это Junction. Как получить реальный путь для Junction описано например здесь: https://www.codeproject.com/Articles/21202/Reparse-Points-in-Vista. Но учтите, что это не единственный тип "папки-ссылки" в Windows.

    "Подскажите, где чего почитать, чтоб не писать бредовое слово "папка-ссылка" и правильно такие ссылки обрабатывать?"

    Устоявшейся русскоязычной терминологии для NTFS-ссылок нет, потому что это довольно низкоуровневая концепция, и документация по ним по большей части не локализована. По ссылке выше вы сами можете увидеть, что работа с Junction требует отправки IOCTL драйверу файловой системы, с Hard links все примерно так же. Англоязычные разделы документации вот: 

    Symbolic Links

    Hard Links and Junctions

    Как правильно обрабатывать? Я бы сказал, никак. ОС автоматически все делает за вас, прозрачно превращая ссылки в реальные пути, т.е. код File.ReadAllText(@"C:\Documents and settings\Vasya\Documents\myfile.txt");  автоматически прочитает файл "C:\Users\Vasya\Documents\myfile.txt". При выводе списка файлов пользователю, просто скройте ссылки (они и так по большей части являются скрытыми файлами и проводник не показывает их, пока мы его об этом не попросим). Если вы не пишете специфическое системное ПО, вы не должны заморачиваться с NTFS-ссылками.

    • Помечено в качестве ответа Liliya Muray 2 февраля 2020 г. 13:09
    1 февраля 2020 г. 8:18

Все ответы

  • Подскажите как правильно работать на языке C# с папками ссылками.

    С помощью DirectoryInfo и GetDirectories можно получить список папок в каталоге. При вызове для папки "с:\" мы получаем среди прочих "папку-ссылку", которой не существует в реальности, например: "Documents and Settings". Как для такой "папки-ссылки" получить реальный путь.

    Подскажите, где чего почитать, чтоб не писать бредовое слово "папка-ссылка" и правильно такие ссылки обрабатывать?

    Здравствуйте.

    Посмотрите здесь: https://docs.microsoft.com/ru-ru/dotnet/standard/io/file-path-formats 

    и здесь: https://docs.microsoft.com/ru-ru/dotnet/api/system.io.path.getfullpath?view=netframework-4.8 

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


    Alexandr_Smirnoff

    30 января 2020 г. 23:10
  • Посмотрите здесь: https://docs.microsoft.com/ru-ru/dotnet/standard/io/file-path-formats 

    и здесь: https://docs.microsoft.com/ru-ru/dotnet/api/system.io.path.getfullpath?view=netframework-4.8 

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

    Проблема не в нормализации пути, а в том что папка имеет атрибуты:

    Имя Значение Тип
    Attributes Hidden | System | Directory | ReparsePoint | NotContentIndexed System.IO.FileAttributes

    Атрибут ReparsePoint говорит о том, что папка физически не существует на диске. Эта папка добавлена в список каталогов для совместимости со старыми версиями Windows.

    Я хотела бы узнать есть функции для преобразования пути от папки с атрибутом ReparsePoint к папке без этого атрибута.

    Например: путь "C:\Documents and Settings\" должен преобразован в "C:\Users\", так как папка "Users" является современным аналогом папки "Documents and Settings".

    31 января 2020 г. 6:13
  • "С помощью DirectoryInfo и GetDirectories можно получить список папок в каталоге. При вызове для папки "с:\" мы получаем среди прочих "папку-ссылку", которой не существует в реальности, например: "Documents and Settings". Как для такой "папки-ссылки" получить реальный путь."

    Конкретно Documents and Settings - это Junction. Как получить реальный путь для Junction описано например здесь: https://www.codeproject.com/Articles/21202/Reparse-Points-in-Vista. Но учтите, что это не единственный тип "папки-ссылки" в Windows.

    "Подскажите, где чего почитать, чтоб не писать бредовое слово "папка-ссылка" и правильно такие ссылки обрабатывать?"

    Устоявшейся русскоязычной терминологии для NTFS-ссылок нет, потому что это довольно низкоуровневая концепция, и документация по ним по большей части не локализована. По ссылке выше вы сами можете увидеть, что работа с Junction требует отправки IOCTL драйверу файловой системы, с Hard links все примерно так же. Англоязычные разделы документации вот: 

    Symbolic Links

    Hard Links and Junctions

    Как правильно обрабатывать? Я бы сказал, никак. ОС автоматически все делает за вас, прозрачно превращая ссылки в реальные пути, т.е. код File.ReadAllText(@"C:\Documents and settings\Vasya\Documents\myfile.txt");  автоматически прочитает файл "C:\Users\Vasya\Documents\myfile.txt". При выводе списка файлов пользователю, просто скройте ссылки (они и так по большей части являются скрытыми файлами и проводник не показывает их, пока мы его об этом не попросим). Если вы не пишете специфическое системное ПО, вы не должны заморачиваться с NTFS-ссылками.

    • Помечено в качестве ответа Liliya Muray 2 февраля 2020 г. 13:09
    1 февраля 2020 г. 8:18
  • Ну и в дополнение, кто не хочет заморачиваться с IOCTL, можно попробовать парсить вывод cmd. Команда dir /al выводит информацию о ссылках:

    c:\>dir /al
     Том в устройстве C не имеет метки.
     Серийный номер тома: 489A-49E7
    
     Содержимое папки c:\
    
    14.07.2009  10:08    <JUNCTION>     Documents and Settings [C:\Users]
                   0 файлов              0 байт
                   1 папок   1 063 370 752 байт свободно

    1 февраля 2020 г. 8:22
  • Сложновато для понимания пользователя по уровню чуть выше, чем чайник)) Но, все же попробую
    6 февраля 2020 г. 9:34