Ошибка при поиске файла с длинным путем к файлу python — путь к файлу длиной более 255 символов

#python-3.x #filepath

#python-3.x #путь к файлу

Вопрос:

Обычно я не задаю вопросов, потому что нахожу ответы на этом форуме. Это место — золотая жила.

Я пытаюсь переместить некоторые файлы из устаревшей системы хранения (общий ресурс CIFS) в BOX, используя python SDK. Это работает нормально, пока путь к файлу меньше 255 символов.

Я использую os.walk для передачи имени общего ресурса в формате unix для перечисления файлов в каталоге

Вот имя файла.

//dalnsphnas1.mydomain.com/c $/ fs/ hdrive/home/abcvodopivec / ENV Resources / Обзор новых правил / Обзоры правил и письма с комментариями / Общие разрешения на ливневую канализацию / Разрешение CT S. W. Gen/PRMT0012_FLPR Письмо с комментариями к предлагаемым правилам ливневой канализации — 06-30-2009.pdf

Я также пытался экранировать файл, но все равно получаю FileNotFoundError , хотя файл там есть.

//dalnsphnas1.mydomain.com/c $/fs/hdrive/home/abcvodopivec/ENV Resources / Обзор новых правил / Обзоры правил и письма с комментариями / Общие разрешения на ливневую канализацию / Разрешение CT S. W. Gen/PRMT0012_FLPR Comment Letter on Proposed Stormwater Regulations — 06-30-2009.pdf

Поэтому я попытался сократить путь, используя win32api.GetShortPathName , но он выдает то же самое FileNotFoundError . Это отлично работает с файлами с длиной пути менее 255 символов.

Также пытался скопировать файл с помощью copyfile(src, dst) в другую папку назначения, чтобы устранить эту проблему, и по-прежнему получал ту же ошибку.

 import os, sys
import argparse
import win32api
import win32con
import win32security
from os import walk

parser = argparse.ArgumentParser(
    description='Migration Script',
)

parser.add_argument('-p', '--home_path',  required = True, help='Home Drive Path')

args = vars(parser.parse_args())

if args['home_path']:
    pass
else:
    print("Usage : script.py -p <path>")
    print("-p <directory path>/")
    sys.exit()

dst = (args['home_path']   '/'   'long_file_path_dir')

for dirname, dirnames, filenames in os.walk(args['home_path']):
    for filename in filenames:
        file_path = (dirname   '/'   filename)
        path_len = len(file_path)
        if(path_len > 255):
            #short_path = win32api.GetShortPathName(file_path)
            copyfile(file_path, dst, follow_symlinks=True)
  

Комментарии:

1. Поскольку вы получаете данные из API, пытались ли вы получить данные с помощью urllib?

2. вы пробовали с /?//dalnsphnas1.mydomain.com/c$/fs/hdrive/home/abcvodopivec/ENV Resources/New Regulation Review/Regulation Reviews and Comment Letters/Stormwater General Permits/CT S.W. Gen Permit/PRMT0012_FLPR Comment Letter on Proposed Stormwater Regulations - 06-30-2009.pdf ?

3. можете ли вы опубликовать фрагмент кода, который тоже не работает?

4. Ограничение пути в 255 символов — это особенность Windows. Обычный обходной путь заключается в том, чтобы cd ( os.chdir на Python) перейти в некоторый каталог по проблемному пути, а затем использовать относительный путь короче 255 символов для ссылки на нужный файл. Вероятно, вы захотите запомнить свой исходный каталог ( os.getcwd ), чтобы cd вернуться туда после того, как разберетесь с труднодоступным файлом или поддеревом.

5. Динеш, я перечисляю файлы по пути UNC. Не уверен, как urllib будет работать в этой ситуации. Джин, я пытался добавить «\?\» к пути, но безуспешно. Отто, chdir, похоже, для меня сейчас остался единственный вариант. Но я хотел бы, чтобы был лучший способ сделать это. Потому что у меня есть большое количество общих ресурсов для миграции, что значительно замедлит мою работу. Жан, я опубликую пример кода.

Ответ №1:

После множества проб и ошибок я нашел решение (благодаря форуму stockoverflow)

  • переключен с формата unix на путь UNC
  • Затем добавляем каждый файл, сгенерированный через ОС.использовать r’\?UNC’, как показано ниже. Путь UNC начинается с двух обратных косых черт, я должен удалить одну, чтобы заставить ее работать

    file_path = (r’\?UNC’ file_path[1:])

Еще раз спасибо всем, кто откликнулся.

Shynee