Поскольку используемые переменные извне lamda должны быть (неявно) окончательными, вы должны использовать что-то вроде AtomicInteger
или написать свою собственную структуру данных.
Чтобы найти файлы по UNC-путям, нужно использовать магический префикс \\?\UNC\
, а не просто \\?\
.
Ссылка: https://msdn.microsoft.com/en-us/library/aa365247 (VS.85) .aspx # maxpath
Так что для доступа //server/share/really/deep/path/etc/etc
, вам нужно
unicode()
) "\\?\\UNC\"
) и "\"
(см. 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 () в верхнем каталоге.
В моем предыдущем комментарии я сказал, что вложенный рекурсивный вызов 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)