我有一个访问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。 由于文件在服务器上或不在...可能抛出异常更好... 我很感激任何建议。 谢谢,
答案 0 :(得分:1)
你说第二个副本几乎是即时的,所以几乎可以肯定排除你的代码的基本问题(而且我看不到复制代码本身的任何基本问题)。 您是否尝试在调试器中单步执行程序以查看它“挂起”或花费异常时间的行?
我之前看到的具有类似症状的问题是,当Windows客户端复制Linux Samba服务器时,使用较旧的Samba版本:“连接”需要花费大量时间,之后一切正常速度。
作为一个更一般的评论,我会努力做一个更好的separation of concerns,在表单对象中使用filecopy方法并不是最先进的......
答案 1 :(得分:1)
这可能有所帮助:Delphi Fast File Copy
答案 2 :(得分:1)
由于这是一个网络资源,因此问题的最可能原因是系统必须先缓存源目录才能开始传输文件。缓存目录后,性能会提高。
您可以“减少”此金额的一种方法是在程序启动时通过线程请求文件以“灌注泵”。扔掉结果吧。我的建议是创建一个只有几个字节的小“虚拟”文件。
另一个选择是编写一个简单的服务器,您将在服务器上运行该服务器以向您的程序提供文件。这种方法的优点是您可以轻松添加可能加速文件传输的动态压缩(取决于传输的数据类型)。
答案 3 :(得分:0)
:
if FileExists(sourceFile) then
sourceFile中有什么内容?
当然不是(projectFilesURL + fileName)你可能想要的
答案 4 :(得分:0)
我不确定这是否是您的问题,但浏览,使用和复制映射文件(您已将驱动器号分配给网络驱动器)比使用UNC(\ Intranet)表示法要快得多。如果您可以为所有客户映射驱动器,这可能会提高您的性能。