【问题标题】:Python How to use extended path lengthPython如何使用扩展路径长度
【发布时间】:2012-11-16 23:57:16
【问题描述】:

我在 Windows 上运行我的 python 代码并尝试遍历并将所有文件名及其路径存储在一个文件中。但是 Windows 有 260 个字符的限制。

os.chdir(self.config.Root_Directory_Path())        
    for root, dirs, files in os.walk("."):
        file_list.extend( join(root,f) for f in files )
    file_name_sorted = sorted(file_list)
    #file_sorted = sorted(file_list, key=getsize)
    #time.strftime("%m/%d/%Y %I:%M:%S %p" ,time.localtime(os.path.getmtime(file)))
    f = open(self.config.Client_Local_Status(),'wb')        
    for file_name in file_name_sorted:
        if (os.path.exists(file_name)):
            #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8'))
            pass
        else:
            print(file_name + "|" + str(len(file_name) + len(originalPath)) + "\n")
            print(os.path.getmtime(file_name))
            #f.write((str(os.path.getmtime(file_name)) + "|" + file_name + "\n").encode('utf-8'))
    f.close()

因为错误,os.path.getmtime(file_name) 抛出一个未找到的异常文件。我该如何克服这个问题?我尝试使用 //?/ 字符作为前缀,如

中所建议的那样

http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

但是没有成功使用 //?/ 字符。

我试过用os.path.getmtime("////?//" + file_name) #Threw an error invalid path

请提出修复建议

【问题讨论】:

  • @PedroRomano 没问题。谢谢...期待一些帮助
  • @PedroRomano 近 2 天来,我一直在疯狂寻找解决方案。如果您喜欢这个问题,请对此投赞成票,以便我希望很多人都能看到。谢谢
  • 如果您使用正斜杠,请不要像那样将它们加倍。只有反斜杠需要加倍,因为反斜杠是(非原始)字符串的转义字符;斜线是一个完全正常的字符。试试'//?/' 而不是'////?//' 看看会发生什么。
  • 另外,我认为您只能将 \\?\ 与绝对路径一起使用。从您对 Pedro Romano 的回答的评论来看,您似乎有一条以 ./ 开头的相对路径。尝试用os.path.abspath(file_name) 代替file_name
  • 由于我添加了其他 cmets 的答案被删除了,让我在这里重复重要的一点:你不能这样做 r'\\?\\',因为这会导致额外的反斜杠,使路径无效.如果正斜杠不起作用(使用abspath),请尝试\\\\?\` (again with abspath`)。

标签: python python-3.x


【解决方案1】:

这里的问题是您使用的是相对路径。 \\?\ 前缀只能应用于绝对路径。正如the documentation 所说:

这些前缀不用作路径本身的一部分。它们表示应该以最少的修改将路径传递给系统,这意味着您不能使用正斜杠来表示路径分隔符,或者使用句点来表示当前目录,或者使用双点来表示父目录。因为您不能将“\\?\”前缀与相对路径一起使用,所以相对路径的总长度总是限制为 MAX_PATH 个字符。

修复很简单。而不是这个:

'\\\\?\\' + file_name

这样做:

'\\\\?\\' + os.path.abspath(file_name)

您不能使用正斜杠。添加额外的反斜杠可能合法也可能不合法,在这种情况下,您可以使用r'\\?\\' 而不是加倍双反斜杠。试试看(但请确保测试C:\foo 之类的驱动器前缀路径和\\server\share\bar 之类的UNC 路径)……但是上面的双反斜杠版本肯定可以工作。

【讨论】:

  • @abarnet:实际上我在测试中总是使用绝对(文字)路径。我从来没有想过@Romaan 会使用相对路径。这就是让我失望的原因。我猜os.path.join(r'\\?\\', os.path.abspath(very_long_file_name)) 真的会起作用。无论如何,为您的出色回答 +1。
  • @PedroRomano:我想从他的代码中应该可以明显看出他有相对路径……但对我来说并不明显。直到他对您的一位 cmets 的回应之一,我才注意到。所以,我也不会觉得这对你来说也不明显。无论如何,我们最终想通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2022-10-12
  • 2023-03-09
相关资源
最近更新 更多