Delphi 将文件从服务器复制到本地驱动器-什么会降低获取文件的访问速度?

Delphi 将文件从服务器复制到本地驱动器-什么会降低获取文件的访问速度?,delphi,Delphi,我有一个访问内联网上文件的应用程序。用户可以将文件从位于网络上的服务器复制到本地PC。我遇到了初始连接问题。i、 e.当应用程序启动时。用户在数据库中搜索该文件。当他找到一个他想要下载的文件时,他点击这个名字,应用程序就会下载它。 第一次下载操作大约需要8-12秒来初始化下载并查看进度条。接下来的下载几乎是即时的。文件大小因时间而异 1 MB到15 MB 这是我的密码: const projectFilesURL = '\\IntranetServer\Directory\filesLoca

我有一个访问内联网上文件的应用程序。用户可以将文件从位于网络上的服务器复制到本地PC。我遇到了初始连接问题。i、 e.当应用程序启动时。用户在数据库中搜索该文件。当他找到一个他想要下载的文件时,他点击这个名字,应用程序就会下载它。 第一次下载操作大约需要8-12秒来初始化下载并查看进度条。接下来的下载几乎是即时的。文件大小因时间而异 1 MB到15 MB

这是我的密码:

 const
 projectFilesURL = '\\IntranetServer\Directory\filesLocation\';

    procedure form1.GetSelectedFile(const fileName: string);
    var
    sourceFile: string;
    begin
    { \\IntranetServer\Directory\filesLocation\userSelectedFile.zip}
    sourceFile := projectFilesURL + fileName;    

      if FileExists(sourceFile) then
      begin

       fileCopy(fileName);
       lblSearching.Hide;
       AnimSearching.Hide;

      end
  else
  MessageDlg(
    'The file was not found on the server'
      , mtInformation, [mbCancel], 0);
 end;

end;
procedure form1.fileCopy(const sourceFile: string);
 var
   SourceF, DestF: file;
   Buf: array [0 .. 1023] of byte;
   NumRead, FSize, BytesCopied: Integer;
   destinationPathandFile: string;
begin
  destinationPathandFile := ExtractFilePath(ParamStr(0))
    + exportPath + sourceFile;
try
  AssignFile(SourceF, projectFilesURL + sourceFile);
  AssignFile(DestF, destinationPathandFile);
  FileMode := 0;
  Reset(SourceF, 1);
  Rewrite(DestF, 1);
  FSize := FileSize(SourceF);
  BytesCopied := 0;

 fileCopyProgress.Percent := 0;
  while not Eof(SourceF) do
  begin
    BlockRead(SourceF, Buf, SIZEOF(Buf), NumRead);
    BlockWrite(DestF, Buf, NumRead);
    Inc(BytesCopied, NumRead);

   fileCopyProgress.Percent := (BytesCopied * 100) div FSize;
   Application.ProcessMessages;
end;
CloseFile(SourceF);
CloseFile(DestF);

except
  on E: Exception do
  begin
  raise Exception.Create('Error occured while copying a file');

  Exit;
end;

end;
我不确定哪里可能是一个瓶颈…也许文件存在是没有必要的。 由于文件是否在服务器上…可能引发异常更好。。。 我感谢你的建议。 谢谢,

在GetSelected中:

  if FileExists(sourceFile) then
源文件中有什么?

当然不是(projectFilesURL+fileName),这是您可能想要的

您说第二个副本几乎是即时的,因此您的代码的基本问题几乎肯定被排除在外(而且我看不到副本代码本身有任何基本问题)。 您是否尝试过在调试器中单步执行程序,以查看它在哪一行“挂起”或花费异常的时间

我以前见过的类似症状的一个问题是,当Windows客户机从Linux Samba服务器复制过来时,使用的是稍旧的Samba版本:需要花费大量时间才能“连接”,之后一切都以正常速度工作


作为一个更一般的评论,我会朝着一个更好的方向努力,在表单对象中使用filecopy方法并不是最先进的…

我不确定这是否是您的问题,但是浏览、处理和复制映射文件(您已将驱动器号分配给网络驱动器)要比使用UNC(\Intranet)快得多符号如果您可以为所有客户端映射驱动器,这可能会提高您的性能。

因为这是一个网络资源,所以问题最可能的原因是系统必须先缓存源目录,然后才能开始传输文件。一旦缓存了目录,性能就会提高

可以“减少”这个数量的一种方法是在程序启动时通过线程请求一个文件来“为泵充注”。把结果扔掉就行了。我的建议是创建一个只有几个字节大小的小“虚拟”文件


另一种选择是编写一个简单的服务器,您可以在该服务器上运行该服务器,以便为您的程序提供文件。这种方法的优点是,您可以轻松添加即时压缩,这可能会加快文件传输速度(取决于传输的数据类型)。

您好,Francois,我已经更新了代码。是的,sourceFile是ProjectFileURL和fileName的连接字符串。谢谢你的回答,我将把一个文件副本移动到一个类中。有趣的是,你提到了一个虚拟文件,但我实际上就是这么做的。我连接并在加载启动屏幕时得到一个小文件。这不是一个完美的解决方案,但它是有效的。