2009-10-24 24 views
1

我有一个应用程序访问内部网上的文件。用户可以将文件从位于网络上的服务器复制到本地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是没有必要的。 由于文件是在服务器上或不...可能抛出异常更好... 我欣赏任何建议。 谢谢,

回答

1

这可能会帮助:Delphi Fast File Copy

+0

感谢您的链接乔,这是一个很好的例子,我会看看如果我可以用我的程序来实现它。 – Greener 2009-10-25 00:44:17

0

在GetSelected:

if FileExists(sourceFile) then 

是什么的资源文件?
当然不是(projectFilesURL +文件名),这是你可能会想要什么

+0

嗨弗朗索瓦, 我已更新我的代码。 是的,sourceFile完全是projectFilesURL和fileName的连接字符串。 – Greener 2009-10-24 00:48:21

1

你说的第二个副本几乎是瞬间,让你的代码的一个根本问题是几乎可以肯定排除了(我没有看到任何根本问题反正在复制代码本身)。 您是否尝试过在调试器中的程序,以查看它“挂起”或花费异常时间的行?

我以前看到过的一个类似症状的问题是,当Windows客户端拷贝一个Linux Samba服务器时,使用的Samba版本较旧:需要大量时间才能“连接”,然后所有工作都在正常速度。

作为一个更普遍的话,我会朝着更好的separation of concerns工作,具有在表单对象filecopy方法是不是真的最先进的...

+0

感谢您的回答,我将把fileCopy移动到一个类中。 – Greener 2009-10-24 01:50:47

0

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

1

由于这是一个网络资源,导致问题的最可能原因是系统在开始传输文件之前必须缓存源目录。一旦目录被缓存,你的性能就会提高。

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

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

+0

有趣的是你提到了一个虚拟文件,但这是我真正做到的。 我在加载启动画面期间连接并获取一个小文件。不是一个完美的解决方案,但它工作。 – Greener 2009-10-27 11:48:55

相关问题