通常我不问问题,因为我在这个论坛上找到答案。这个地方是金矿。
我正在尝试使用python SDK将某些文件从旧式存储系统(CIFS共享)移至BOX。只要文件路径少于255个字符,它就可以正常工作。
我正在使用os.walk
以Unix格式传递共享名,以列出目录中的文件
这是文件名。
// dalnsphnas1.mydomain.com/c$/fs/hdrive/home/abcvodopivec/ENV资源/新法规审查/法规审查和评论信/斯托姆沃特一般许可/ CT S.W. Gen Permit / PRMT0012_FLPR关于拟议的雨水法规的评论信-2009年6月30日。pdf
我也尝试转义文件,但是即使文件存在,我仍然得到FileNotFoundError
。
// dalnsphnas1.mydomain.com/c$/fs/hdrive/home/abcvodopivec/ENV资源/新法规审查/法规审查和评论信/斯托姆沃特一般许可/ CT S.W. Gen Permit / 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)
答案 0 :(得分:0)
经过反复试验,找到了解决方案(感谢stockoverflow论坛)
然后使用r'\\?\ UNC'附加通过os.walk生成的每个文件,如下所示。 UNC路径以两个反斜杠开头,我必须删除其中一个才能使其正常工作
file_path =(r'\\?\ UNC'+ file_path [1:])
再次感谢所有答复。
Shynee