powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как получить короткий путь к папке?
15 сообщений из 15, страница 1 из 1
Как получить короткий путь к папке?
    #39764634
UVG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UVG
Гость
Доброе время суток.

Подскажите , пожалуйста, как получить короткий путь к папке.
Есть какая-то сетевая папка с длинным путём. Например:
\\common-server\Какие-то данные\Вложенные данные\Вложенные данные 1\Вложенные данные 2\Совсем вложенные данные 3....
Этот путь может быть символов до 300 и , наверное, больше.

Если посмотреть свойства папки, то на вкладке "общие" в пункте "Расположение" будет что-то типа:

\\common-server\Какие-то данные\Вложенные данные\AD5F~1\548E~1\64F8~1...

Проблема в том, что некоторые функции .Net (например Directoryinfo.GetAccessControl()) вываливаются с ошибкой (директория не найдена) на таких длинных путях, что и логично, т.к. это больше максимально допустимой длины в названии.

Но, если подставить короткий путь (c ~), скопировав из свойств в проводнике, то всё работает. Этот короткий путь можно получить с помощью WinApi функции GetShortPathName (варианты GetShortPathNameA, GetShortPathNameW).

Вроде всё и хорошо, но эта функция не всегда отрабатывает на длинных путях.
Объявлена так:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int GetShortPathNameW(string pathName, StringBuilder shortName, int cbShortName);


Вариации с атрибутом CharSet пробовал разные.Вариант для длинных UNC (\\?\), описанный в документации МС, тоже пробовал.
С помощью классов .Net (DirectoryInfo,Path,Directory) удавалось получить только длинный путь.

Не подскажите, как можно получить короткий путь к папке или заставить работать функции .Net (например Directoryinfo.GetAccessControl()) на длинных путях?
ОС: Windows 10, 64 bit
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764647
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764650
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764662
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файл может не иметь короткого имени, оно не обязательно.
размер строки в C# 2 гб
размер пути в файловой системе NTFS 32,767, по 256 на компонент пути.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public static class KernelHelper
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetShortPathName(string pathName, StringBuilder shortName, int cbShortName);
        public static string GetShortName(string path)
        {
            StringBuilder shortName = new StringBuilder(path.Length);
            GetShortPathName(path, shortName, path.Length);
            return shortName.ToString();
        }
    }
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764664
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,
)) это ход конём.))
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764666
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UVG,
Кстати, откуда появляются такие пути?))
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764674
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Кстати, откуда появляются такие пути?))Перенос папок с вложенными подпапками, переименование промежуточных папок
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764690
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Я же не про это. У нас на шаре нет такого бардака.
Это самим неудобно. Архиваторы не работают как дОлжно и безглючно.
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764692
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Shocker.Pro,
Я же не про это. У нас на шаре нет такого бардака.
Это самим неудобно. Архиваторы не работают как дОлжно и безглючно.На каком таком шаре? Не нада ля-ля, все работает нормально и определяется не именем папок, а исключичельно радиусом кривизны рук.
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764716
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,
Шара это расшаренная папка выполненных работ сотрудниками. Когда не в базу результат.
Глючит, это когда архивируешь длинный путь и потом выкладываешь у себя в еще более глубокую папку. Ни разу не глючило? Значит повезло.
Про работает нормально фраза не раскрыта.
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764817
UVG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UVG
Гость
Roman MejtesФайл может не иметь короткого имени, оно не обязательно.


Это-то , понятно.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public static class KernelHelper
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetShortPathName(string pathName, StringBuilder shortName, int cbShortName);
        public static string GetShortName(string path)
        {
            StringBuilder shortName = new StringBuilder(path.Length);
            GetShortPathName(path, shortName, path.Length);
            return shortName.ToString();
        }
    }

[/quot]

Спасибо. Но я писал в вопросе (забыл только код выделить), что эта функция не отрабатывает на длинных сетевых именах, вне зависимости, кстати, от атрибута CharSet.
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764822
UVG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UVG
Гость
Petro123UVG,
Кстати, откуда появляются такие пути?))


Не знаю. Я не являюсь админом и не создаю эти папки. Но, надеюсь, разобраться, откуда они, нужны ли, можно ли обойтись без них и т.д. и т.п. ))
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764831
UVG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UVG
Гость
Petro123UVG,

https://ru.m.wikipedia.org/wiki/Subst
?

Спасибо )).Такой вариант известен, на аврал. Вариант с dir ... /X , тогда уж тоже можно рассмотреть ))
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764837
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UVGPetro123UVG,
Кстати, откуда появляются такие пути?))


Не знаю. Я не являюсь админом и не создаю эти папки. Но, надеюсь, разобраться, откуда они, нужны ли, можно ли обойтись без них и т.д. и т.п. ))
Да. Отпишись потом что за файлы на такой глубине.
Ну и тест длинного пути сюда дай как пример.
ИЛи ошибка вообще неповторяемая плавающая?
...
Рейтинг: 0 / 0
Как получить короткий путь к папке?
    #39764882
UVG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UVG
Гость
Petro123UVGпропущено...



Не знаю. Я не являюсь админом и не создаю эти папки. Но, надеюсь, разобраться, откуда они, нужны ли, можно ли обойтись без них и т.д. и т.п. ))
Да. Отпишись потом что за файлы на такой глубине.
Ну и тест длинного пути сюда дай как пример.
ИЛи ошибка вообще неповторяемая плавающая?

Файлы какие...., обычные пользовательские файлы, на такой глубине (эксели, доки и т.д. и т.п.).В большинстве своём, программы с ними работают, но некоторые глючат...

Ошибка не плавает, прекрасно повторяется (GetLastWin32Error() выдаёт стабильно 3-ку, в описании: "The system cannot find the path specified" ).

Сейчас проблема-то, по сути, решена рекурсивным вызовом GetShortpartNameW , когда сначала короткий путь создаётся, для директории, а потом для вложенных в неё директорий, уже по имеющемуся короткому пути.

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

Ну , а можно ли избавится от сегментов в 8.3 нотации, поговорю, как будет возможность, с админами.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как получить короткий путь к папке?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]