본문 바로가기
delphi

URLDownloadToFile을 이용한 다운로드 방법

by doran365 2024. 8. 3.

Delphi에서 URLDownloadToFile을 이용해 웹상의 파일을 다운로드할 때, 캐시 문제로 인해 최신 파일을 받을 수 없는 경우가 발생합니다. 이런 문제를 해결하기 위해 WinINet 유닛의 DeleteUrlCacheEntry 함수를 사용하여 캐시를 무시하고 최신 파일을 다운로드 받는 방법에 대해 자세히 설명하겠습니다.

URLDownloadToFile 함수 소개

URLDownloadToFile 함수의 기본 사용법

URLDownloadToFile 함수는 UrlMon 유닛에 포함되어 있으며, 웹상의 파일을 로컬 시스템에 다운로드하는 기능을 제공합니다. 기본적인 사용법은 다음과 같습니다:

URLDownloadToFile(nil, PChar(strURL), PChar(strEwiFile), 0, nil);​
  • strURL: 다운로드할 파일의 URL입니다.
  • strEwiFile: 로컬에 저장될 파일의 경로입니다.

URLDownloadToFile 함수의 한계점

이 함수는 매우 편리하지만, 로컬에 저장된 파일을 삭제하고 다시 다운로드하려 할 때 캐시에서 파일을 읽기 때문에 최신 파일을 받을 수 없는 한계가 있습니다.

캐시 문제 해결 방법

DeleteUrlCacheEntry 함수 사용

캐시 문제를 해결하기 위해 WinINet 유닛에 포함된 DeleteUrlCacheEntry 함수를 사용합니다. 이 함수는 지정된 URL의 캐시 엔트리를 삭제하여, 다음 다운로드 시 캐시를 무시하고 최신 파일을 받을 수 있게 해줍니다.

DeleteUrlCacheEntry(PChar(strURL));

이 함수를 URLDownloadToFile 함수 호출 전이나 후에 사용하여 캐시를 무시하는 효과를 얻을 수 있습니다.

실습 예제

캐시를 무시하고 파일 다운로드 받기

아래 예제는 URLDownloadToFile을 사용하여 파일을 다운로드하고, DeleteUrlCacheEntry 함수를 사용하여 캐시를 삭제한 후 다시 다운로드 받는 과정을 보여줍니다.

uses
  UrlMon, WinInet;

procedure DownloadFileWithCacheBypass(const strURL, strEwiFile: string);
begin
  // 파일 다운로드
  URLDownloadToFile(nil, PChar(strURL), PChar(strEwiFile), 0, nil);
  
  // 캐시 엔트리 삭제
  DeleteUrlCacheEntry(PChar(strURL));
  
  // 캐시를 무시하고 파일 다시 다운로드
  URLDownloadToFile(nil, PChar(strURL), PChar(strEwiFile), 0, nil);
end;

이 코드는 파일을 처음 다운로드한 후 캐시를 삭제하고 다시 다운로드하여 항상 최신 파일을 받을 수 있도록 합니다.

URLDownloadToFile과 DeleteUrlCacheEntry의 응용

파일 업데이트 자동화

이 방법을 사용하면 파일이 자주 업데이트되는 경우에도 항상 최신 파일을 받을 수 있습니다. 예를 들어, 주기적으로 업데이트되는 데이터 파일을 다운로드하는 자동화 스크립트를 작성할 수 있습니다.

procedure UpdateDataFile(const strURL, strEwiFile: string);
begin
  // 데이터 파일 다운로드
  URLDownloadToFile(nil, PChar(strURL), PChar(strEwiFile), 0, nil);
  
  // 데이터 파일 캐시 삭제
  DeleteUrlCacheEntry(PChar(strURL));
  
  // 최신 데이터 파일 다운로드
  URLDownloadToFile(nil, PChar(strURL), PChar(strEwiFile), 0, nil);
end;

네트워크 최적화

캐시를 적절히 관리함으로써 네트워크 트래픽을 줄일 수 있습니다. 중요한 파일이나 자주 변경되는 파일의 경우 캐시 무시 다운로드를 사용하고, 그렇지 않은 파일은 캐시를 활용하여 효율적으로 네트워크 자원을 사용할 수 있습니다.

고급 사용법

다른 캐시 관리 함수들

WinINet 유닛에는 DeleteUrlCacheEntry 외에도 다양한 캐시 관리 함수들이 있습니다. 예를 들어, 캐시된 파일 목록을 조회하거나 특정 조건에 맞는 캐시 항목을 삭제하는 함수들이 있습니다.

function DeleteUrlCacheEntry(lpszUrlName: PChar): BOOL; stdcall; external 'wininet.dll' name 'DeleteUrlCacheEntry';

function FindFirstUrlCacheEntry(lpszUrlSearchPattern: PChar; lpFirstCacheEntryInfo: PInternetCacheEntryInfo; lpcbCacheEntryInfo: LPDWORD): HANDLE; stdcall; external 'wininet.dll' name 'FindFirstUrlCacheEntry';

function FindNextUrlCacheEntry(hEnumHandle: HANDLE; lpNextCacheEntryInfo: PInternetCacheEntryInfo; lpcbCacheEntryInfo: LPDWORD): BOOL; stdcall; external 'wininet.dll' name 'FindNextUrlCacheEntry';
 

캐시 항목 조건 삭제

특정 조건에 맞는 캐시 항목만 삭제하고자 할 때는 FindFirstUrlCacheEntry와 FindNextUrlCacheEntry 함수를 사용하여 조건에 맞는 캐시 항목을 찾아서 삭제할 수 있습니다.

procedure DeleteSpecificCacheEntries(const strPattern: string);
var
  hFind: HANDLE;
  CacheEntryInfo: TInternetCacheEntryInfo;
  CacheEntryInfoSize: DWORD;
begin
  CacheEntryInfoSize := SizeOf(CacheEntryInfo);
  hFind := FindFirstUrlCacheEntry(PChar(strPattern), @CacheEntryInfo, @CacheEntryInfoSize);
  
  if hFind <> 0 then
  begin
    repeat
      // 조건에 맞는 캐시 엔트리 삭제
      if (ConditionMet(CacheEntryInfo)) then
        DeleteUrlCacheEntry(CacheEntryInfo.lpszSourceUrlName);
        
    until not FindNextUrlCacheEntry(hFind, @CacheEntryInfo, @CacheEntryInfoSize);
  end;
end;
 

결론

Delphi에서 URLDownloadToFile 함수를 사용하여 웹상의 파일을 다운로드할 때 캐시 문제를 해결하는 방법에 대해 알아보았습니다. DeleteUrlCacheEntry 함수를 사용하면 캐시를 무시하고 항상 최신 파일을 받을 수 있습니다. 이를 통해 네트워크 최적화와 파일 업데이트 자동화를 효과적으로 수행할 수 있습니다.