无法在 python 中复制有效文件

Can't copy a valid file in python

更新:重要 好吧,我担心文件名的长度已经有一段时间了,据我所知 windows,有时文件名超过 256 个字符会出现问题。这些似乎超过了 260 个字符。所以这不是代码而是限制。


我已经创建了一个 python 脚本,其中包括要复制的一些文件,这些文件已被跳过。现在我 运行 陷入困境,其中 SOME 文件未被复制。现在这些文件在我们的共享上,而且往往有很长的名字。我几乎可以肯定这起到了一定的作用,因为它们的长度为 260 个字符。有人有办法解决这个问题吗?

代码: 编辑 -- 我已经编辑了代码以尝试@realizedvariance 建议

if not file_path=="":
    if not file_path.find("~$") > 0:
        folder_name, file_name = os.path.split(file_path)
        if os.path.exists(folder_name):
            for thefile in os.listdir(folder_name): 
                if thefile.lower().rstrip().lstrip() == file_name.lower().rstrip().lstrip():
                    print thefile
                    print os.path.exists(folder_name)
                    print os.path.exists(os.path.join(folder_name, thefile))

它们失败的文件是名称如下的文件:

这是打印的响应:

Draft DR 129123 CP, Amendment No. 3 to AS NaZT 60335.2.11 2009 Household and similar electrical appliances - Safety – Part 2.11  .msg
True
False
DaltaPlaneR Business Information Newsletter - Issue 79, 2010 - Social Networking Apps in Business - Grail Roads Ltd.msg
True
False
From DaltaPlaneR - Business Newsletter - Issue 78 - 2009 - Important Terms of Trade - Strategic Businesses Ltd.msg
True
False

所以它打印文件名,如果文件夹位置为真,然后如果完整位置为真。请记住,它确实从 os.listdir(path)

中获取了文件名

您确定两个列表中的文件名大小写和格式完全相同吗?也许尝试一个简单的改变:

for thefile.lower().rstrip().lstrip() == file_name.lower().rstrip().lstrip()

不是最优雅的,但可能需要检查一下。也可能存在 unicode / 字符串问题。也尝试将它们包装在 str() 中。

我没有能力发表评论,或者我会。

脚本的输出会有很大帮助。我认为这可能是因为空格,但我已经手动测试了指定 file_path = '/home/user/test.txt'file_path = '/home/user/test 2.txt' 的脚本,没有失败。你如何设置变量?您是否使用一些将空格解释为文件名末尾的语法来设置它?如果是这样,请尝试像 '\ '.

这样转义空格

原来我对文件路径名太长的看法是正确的。我需要的是一个 UNC 命令,用于从我发出的请求中排除 MAX_PATH

我需要将 \?\UNC 作为我的 file_path 字符串的前缀包含在内,最终转换为 \\?\UNC

下面是代码:

if not file_path=="":
        if not file_path.find("~$") > 0:
            file_path="\\?\UNC"+file_path
            print os.path.exists(file_path)

我找到的信息来自 MAX_PATH 的 Microsoft MSDN 主题,来自 Naming Files, Paths, and Namespaces 的 post 重要的是要了解我也在使用基于服务器的共享,所以我需要完整的文件路径“\\”。