【问题标题】:Delphi Copyfile fail on long filename (over MAX_PATH) [duplicate]Delphi Copyfile在长文件名上失败(超过MAX_PATH)[重复]
【发布时间】:2017-06-30 08:57:14
【问题描述】:

我有一个源文件要复制到目标位置:

aSource := 'C:\very_very_very_long_path\myfile.exe'; // over 260 chars
aTarget := 'C:\normal_path\myfile.exe';

if not(CopyFile(PChar(aSource), PChar(aTarget), false)) then
    RaiseLastOSError;

此代码引发异常代码 3 - 这意味着 ERROR_PATH_NOT_FOUND

目标和源路径存在,如果我将源重命名为一个较短的名称,它可以工作。

如何复制具有长路径的文件(超过MAX_PATH)?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    当提供前缀\\?\ 时,Delphi 应遵循允许长文件名的Window convention。例如,将"D:\very long path" 转换为"\\?\D:\very long path"

    此前缀仅在使用 API 的 Unicode 版本时适用,在这种情况下为 CopyFileW。如果您使用的是 Delphi 2009 或更高版本,则 CopyFile 映射到 CopyFileW。如果您使用较早的版本,则需要显式调用 CopyFileW,并确保您传递的字符串是 UTF-16 编码的。

    【讨论】:

    • 除此之外,您必须确保您使用的是 Unicode API。因此,在 2009 年之前的版本中,需要调用 CopyFileW
    • 好点,我会加进去的。
    • Per MSDN: "从 Windows 10 版本 1607 开始,MAX_PATH 限制已从常见的 Win32 文件和目录功能中删除。但是,您必须选择加入新行为." CopyFileW 是功能之一。
    【解决方案2】:

    字符串文字只能是 255 个字符长。你可以这样做:

    aSource := 'Patht 255 Chars'+'Rest of the Path';
    

    【讨论】:

    • 很明显这不是手头的问题。毕竟,问题中使用的文字不超过 260 个字符,所以显然使用的值已被修剪。
    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2019-07-25
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多