Delphi 将文件从服务器复制到本地驱动器-什么会降低获取文件的访问速度?
我有一个访问内联网上文件的应用程序。用户可以将文件从位于网络上的服务器复制到本地PC。我遇到了初始连接问题。i、 e.当应用程序启动时。用户在数据库中搜索该文件。当他找到一个他想要下载的文件时,他点击这个名字,应用程序就会下载它。 第一次下载操作大约需要8-12秒来初始化下载并查看进度条。接下来的下载几乎是即时的。文件大小因时间而异 1 MB到15 MB 这是我的密码:Delphi 将文件从服务器复制到本地驱动器-什么会降低获取文件的访问速度?,delphi,Delphi,我有一个访问内联网上文件的应用程序。用户可以将文件从位于网络上的服务器复制到本地PC。我遇到了初始连接问题。i、 e.当应用程序启动时。用户在数据库中搜索该文件。当他找到一个他想要下载的文件时,他点击这个名字,应用程序就会下载它。 第一次下载操作大约需要8-12秒来初始化下载并查看进度条。接下来的下载几乎是即时的。文件大小因时间而异 1 MB到15 MB 这是我的密码: const projectFilesURL = '\\IntranetServer\Directory\filesLoca
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的连接字符串。谢谢你的回答,我将把一个文件副本移动到一个类中。有趣的是,你提到了一个虚拟文件,但我实际上就是这么做的。我连接并在加载启动屏幕时得到一个小文件。这不是一个完美的解决方案,但它是有效的。