You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

URLDownloadToFile()是否支持UNC保存路径?Lazarus FPC调用问题排查

解决URLDownloadToFile()写入UNC路径失败的问题

以下是可能的原因和对应的解决方法:

1. 未指定完整目标文件名

URLDownloadToFile要求传入的szFileName必须是具体的文件名,而非目录路径。你当前传入的\\192.168.1.50\Shares\Downloads是目录,需要补充完整的文件名,例如:

\\192.168.1.50\Shares\Downloads\downloaded_file.exe

2. 远程共享权限不足

程序运行的用户身份可能没有访问该UNC共享的权限。本地路径使用当前用户权限即可访问,但访问远程共享时需要显式验证身份。可以先通过Windows API建立共享连接,再执行下载:

uses Windows, Winnetwk;

var
  NetResource: TNetResource;
  Res: DWORD;
begin
  ZeroMemory(@NetResource, SizeOf(TNetResource));
  NetResource.dwType := RESOURCETYPE_DISK;
  NetResource.lpRemoteName := PChar('\\192.168.1.50\Shares');
  // 替换为共享的用户名和密码
  Res := WNetAddConnection2(NetResource, PChar('your_password'), PChar('your_username'), 0);
  
  if Res = NO_ERROR then
  begin
    // 调用URLDownloadToFile,使用完整UNC文件名
    URLDownloadToFile(nil, PChar('http://your-url.com/file.exe'), 
                      PChar('\\192.168.1.50\Shares\Downloads\file.exe'), 0, nil);
    // 断开共享连接
    WNetCancelConnection2(PChar('\\192.168.1.50\Shares'), 0, True);
  end;
end;

3. Urlmon.dll对UNC路径的支持局限

URLDownloadToFile主要为HTTP/HTTPS等网络URL设计,对本地文件系统(包括UNC)的支持并不完善。改用FPC自带的IdHTTP组件下载后写入UNC路径,兼容性更好:

uses IdHTTP, Classes;

var
  IdHTTP1: TIdHTTP;
  SaveStream: TFileStream;
begin
  IdHTTP1 := TIdHTTP.Create(nil);
  try
    // 创建文件流,指向UNC路径的目标文件
    SaveStream := TFileStream.Create('\\192.168.1.50\Shares\Downloads\file.exe', fmCreate or fmShareDenyWrite);
    try
      IdHTTP1.Get('http://your-url.com/file.exe', SaveStream);
    finally
      SaveStream.Free;
    end;
  finally
    IdHTTP1.Free;
  end;
end;

4. 字符串转义错误

确保Pascal字符串中的UNC路径反斜杠正确,使用两个反斜杠表示实际的一个反斜杠,例如'\\192.168.1.50\Shares\Downloads\file.exe',避免因转义问题导致路径无效。


内容的提问来源于stack exchange,提问作者Nikita Glukhov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:33:28