FileNotFoundError长文件路径python-文件路径超过255个字符

时间:2019-03-13 16:37:01

标签: python-3.x filepath

通常我不问问题,因为我在这个论坛上找到答案。这个地方是金矿。

我正在尝试使用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)

1 个答案:

答案 0 :(得分:0)

经过反复试验,找到了解决方案(感谢stockoverflow论坛)

  • 从Unix格式切换为UNC路径
  • 然后使用r'\\?\ UNC'附加通过os.walk生成的每个文件,如下所示。 UNC路径以两个反斜杠开头,我必须删除其中一个才能使其正常工作

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

再次感谢所有答复。

Shynee