2014-10-14 2 views
0

У меня есть скрипт python, работающий на окнах, который просто копирует содержимое каталога из одного места в другое, но я запускаю следующую ошибку, не уверен, почему, я могу подтвердить, что исходный файл присутствует, любая идея на что здесь может быть не так?Python shutil copy failing

File "C:\crmapps\apps\python275-64\lib\shutil.py", line 208, in copytree 
    raise Error, errors 
shutil.Error: [('\\\\WPLBD04\\pkg\\builds\\promote\\2712\\2712_QCA1990ANFC_CNSS.HW_SP.2.0_win_pro\\sumatraservices\\inRexW\\TLM-2009-07-15\\docs\\doxygen\\html\\classtlm__utils_1_1instance__specific__extensions__per__accessor-members.html', '\\\\sun\\sscn_dev_integration\\promote_per_CL_artifacts\\TECH_PRO.CNSS.2.0\\20141013125710_1115240\\2712_QCA1990ANFC_CNSS.HW_SP.2.0_win_pro\\sumatraservices\\inRexW\\TLM-2009-07-15\\docs\\doxygen\\html\\classtlm__utils_1_1instance__specific__extensions__per__accessor-members.html', "[Errno 2] No such file or directory: 
+2

Этот второй путь длиной более 255 символов - на некоторых файловых системах Windows это проблема, если я правильно помню. –

+0

Несомненно, для меня это неправильный путь ... вы уверены, что полный путь цели существует и правильно написана? –

+0

@ LukasGraf Я сделал тест на mac python 2.7 с 320 символами, не проблема с shutil.copy2() и shutil.copyfile(). Может быть, это по-другому на окнах – user1767754

ответ

0

Как сказал Lukas Graf. Проблема в том, что ваш путь назначения составляет 266 символов, и поэтому exceeds the limit.

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

source: \\WPLBD04\pkg\builds\promote\2712\ 
destination: \\sun\sscn_dev_integration\promote_per_CL_artifacts\TECH_PRO.CNSS.2.0\20141013125710_1115240\ 
  1. Вы могли бы попытаться shorten your filepath с win32api, чтобы можно избежать этой проблемы.

    строка = win32api.GetShortPathName (путь)

  2. Вы можете предварять \\?\ использовать extended-length paths.

>>> open(r"C:\%s\%s" % ("a"*1, "a"*254),"w") 
<open file '...', mode 'w' at 0x0000000001F120C0> 
>>> open(r"C:\%s\%s" % ("a"*2, "a"*254),"w") 
IOError: [Errno 2] No such file or directory: '...' 
>>> open(r"C:\%s\%s" % ("a"*1, "a"*255),"w") 
IOError: [Errno 2] No such file or directory: '...' 
>>> open(r"\\?\C:\%s\%s" % ("a"*1, "a"*255),"w") 
<open file '\\\\?\\...', mode 'w' at 0x0000000001F12150> 

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

+0

Вы уверены? Как это может сократить путь без потери чего-либо. Документы говорят только, что он преобразует «путь» в 8.3 имя файла с полным путем. Не говоря уже о связанных документах для python 2.5. – luk32

+0

@ luk32 Посмотрите на вывод ['dir /X'](https://superuser.com/questions/348079/how-can-i-find-the-short-path-of-a-windows-directory- файл). Там будет указано короткое имя для имен не 8.3. Каталоги будут первыми шестью буквами, за которыми следуют '~ 1',' ~ 2' ... – wenzul

+0

Но проблема начинается с того, что у окон не может быть папок длиной до 255 символов, поэтому он не имеет ничего общего с shutil, который не доступен для копирования, как кажется. – user1767754

2

Как уже упоминалось, вы превысили ограничение на размер пути win32. Оказывается, что предел находится в win32, а не в действительных драйверах файловой системы. Трюк для решения проблемы состоит в том, чтобы допустить r"\\?\" к пути, чтобы win32 прошел дорожки, не сбрасывая их. Он работает только в том случае, если вы используете абсолютные имена, включая букву диска.

def win32_fix_long_path(path): 
    return r'\\?\' + os.path.realpath(path) 

Вероятно, это не сработает во всех ситуациях, особенно если вы попытаетесь передать имя подпроцессу.