Невозможно найти файлы с длинными именами в Windows с Python

Поскольку используемые переменные извне lamda должны быть (неявно) окончательными, вы должны использовать что-то вроде AtomicInteger или написать свою собственную структуру данных.

См. https: // docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#accessing-local-variables.

30
задан randomsimon 6 April 2018 в 13:50
поделиться

2 ответа

Чтобы найти файлы по UNC-путям, нужно использовать магический префикс \\?\UNC\, а не просто \\?\.

Ссылка: https://msdn.microsoft.com/en-us/library/aa365247 (VS.85) .aspx # maxpath

Так что для доступа //server/share/really/deep/path/etc/etc, вам нужно

  1. конвертировать его в юникод (используйте конструктор unicode())
  2. добавить магический префикс ("\\?\\UNC\") и
  3. убедиться все разделители каталогов: "\" (см. os.path.normpath())

Результирующая строка Unicode: \\?\UNC\server\share\really\deep\path\etc\etc

Я только немного экспериментировал (намного меньше, чем @stenci) но с Python 2.7 он, кажется, работает нормально с os.walk() и не работает с os.listdir().

Предупреждение: работает с os.walk () только в том случае, если начальный путь обхода находится в пределах предела MAX_PATH, и ни один из подкаталогов в начальном пути также не превысит его. Это потому, что os.walk () использует os.listdir () в верхнем каталоге.

5
ответ дан randomsimon 6 April 2018 в 13:50
поделиться

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

Это функция, которую я сейчас использую:

def short_name(name):
    try:
        return win32api.GetShortPathName(name)
    except win32api.error:
        dirname = os.path.dirname(name)
        basename = os.path.basename(name)
        short_dirname = win32api.GetShortPathName(dirname)
        return win32api.GetShortPathName(os.path.join(short_dirname, basename))

try:
    mtime = os.path.getmtime(name)
except FileNotFoundError:
    name = short_name(name)
    mtime = os.path.getmtime(name)
1
ответ дан stenci 6 April 2018 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: