2009-10-24 3 views
1

인트라넷의 파일에 액세스하는 응용 프로그램이 있습니다. 사용자는 네트워크에있는 서버에서 로컬 PC로 파일을 복사 할 수 있습니다. 초기 연결에 문제가 발생했습니다. 즉 애플리케이션이 시작될 때. 사용자가 데이터베이스에서 파일을 검색합니다. 그가 다운로드 할 파일을 찾으면 그는 이름을 클릭하고 응용 프로그램은 파일을 다운로드합니다. 첫 다운로드 작업은 다운로드를 시작하고 진행률 막대를 보는 데 약 8-12 초 정도 걸립니다. 다음 다운로드는 거의 즉시 이루어집니다. 파일 크기는 1MB에서 15MB 사이입니다. 필요가 없습니다 어쩌면 fileExists ... 질식의 포인트가 될 수있는 곳 나는 확실하지 않다서버에서 로컬 드라이브로 파일 복사 - 파일을 가져 오는 속도가 느려질 수 있습니까?

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에서

답변

1

이 도움이 될 수 ... 폼 객체의 filecopy 방법은 정말 예술의 상태가 아닌 가지고, 더 나은 separation of concerns으로 작동 것 : Delphi Fast File Copy

+0

링크 Joe에게 감사드립니다. 좋은 예입니다. 내 프로그램으로 구현할 수 있는지 알 수 있습니다. – Greener

0

:

if FileExists(sourceFile) then 

가 SourceFile을 무엇입니까? 물론
하지 당신은 당신이 두 번째 복사본이 거의 즉시 그래서 당신의 코드에 근본적인 문제가 거의 확실 제외이라고 말할 (그리고 내가 어떤 근본적인 문제가 표시되지

+0

안녕하세요 Francois, 내 코드를 업데이트했습니다. 예, sourceFile은 정확히 projectFilesURL과 fileName의 연결 문자열입니다. – Greener

1

을 할 수 있습니다 것입니다 (projectFilesURL + fileName에) 복사 코드 자체에 있음). 디버거에서 프로그램을 단계별로 실행하여 비정상적인 시간을 보냈는지 확인해 봤습니까?

이전에 볼 수있는 증상과 관련된 문제는 Windows 클라이언트가 Linux Samba 서버에서 약간 오래된 Samba 버전을 복사 할 때 발생합니다. "연결될 때까지"시간이 오래 걸립니다. 정상 속도. 보다 일반적인 발언으로

, 나는

+0

답해 주셔서 감사합니다. fileCopy를 클래스로 옮깁니다. – Greener

0

이게 당신의 문제인지는 모르겠지만 브라우징, 작업, 매핑 된 파일 (네트워크 드라이브에 드라이브 문자를 할당 한 곳)을 복사하는 것은 UNC (인트라넷) 표기법을 사용하는 것보다 훨씬 빠릅니다. 모든 클라이언트에 대해 드라이브를 매핑 할 수 있다면 성능이 향상 될 수 있습니다.

1

네트워크 리소스이므로 문제는 파일 전송을 시작하기 전에 원본 디렉터리를 캐시해야한다는 것입니다. 디렉토리가 캐시되면 성능이 향상됩니다.

이 양을 "줄일"수있는 한 가지 방법은 프로그램 시작시 스레드를 통해 파일을 "prime the pump"로 요청하는 것입니다. 그냥 결과를 버리십시오. 내 제안은 크기가 단지 몇 바이트 인 작은 "더미"파일을 만드는 것입니다.

또 다른 옵션은 서버에서 실행하여 프로그램에 파일을 제공하는 간단한 서버를 작성하는 것입니다. 이 방법의 장점은 전송되는 데이터의 유형에 따라 파일 전송 속도를 높일 수있는 빠른 압축을 쉽게 추가 할 수 있다는 것입니다.

+0

웃기는 당신은 더미 파일을 언급했지만, 이것은 실제로 내가 한 것입니다. 스플래시 화면로드 중 작은 파일이 연결되어 있습니다. 완벽한 솔루션은 아니지만 작동합니다. – Greener

관련 문제