#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