将文件从服务器复制到本地驱动器 - 什么可能减慢访问获取文件的速度?

时间:2009-10-24 00:04:55

标签: delphi

我有一个访问Intranet上文件的应用程序。用户可以将文件从位于网络上的服务器复制到本地PC。我遇到了初始连接的问题。即应用程序启动时。用户在数据库中搜索文件。当他找到他想要下载的文件时,他点击该名称,然后应用程序下载该文件。 第一次下载操作大约需要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;

我不确定哪里可能是一个令人窒息的点......也许不存在fileExists。 由于文件在服务器上或不在...可能抛出异常更好... 我很感激任何建议。 谢谢,

5 个答案:

答案 0 :(得分:1)

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

我之前看到的具有类似症状的问题是,当Windows客户端复制Linux Samba服务器时,使用较旧的Samba版本:“连接”需要花费大量时间,之后一切正常速度。

作为一个更一般的评论,我会努力做一个更好的separation of concerns,在表单对象中使用filecopy方法并不是最先进的......

答案 1 :(得分:1)

这可能有所帮助:Delphi Fast File Copy

答案 2 :(得分:1)

由于这是一个网络资源,因此问题的最可能原因是系统必须先缓存源目录才能开始传输文件。缓存目录后,性能会提高。

您可以“减少”此金额的一种方法是在程序启动时通过线程请求文件以“灌注泵”。扔掉结果吧。我的建议是创建一个只有几个字节的小“虚拟”文件。

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

答案 3 :(得分:0)

GetSelected中的

  if FileExists(sourceFile) then

sourceFile中有什么内容?
当然不是(projectFilesURL + fileName)你可能想要的

答案 4 :(得分:0)

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

相关问题