2009-04-23 6 views
3

우리는 "이전"웹 응용 프로그램 (원래 CodeCentral은 10 년 전에 작성되었으며, 현재 1237 만 개가 넘는 http://cc.embarcadero.com에서 실행 중입니다)은 다운로드를 제공하기 위해 파일 기반 캐시를 사용합니다. 웹 응용 프로그램은이 파일 캐시를 관리합니다.IIS 및 ASP.NET에서 공유 파일을 업데이트하려면 어떻게합니까?

파일 기반 다운로드를 사용하는 유일한 방법은 다른 버전에서 사용중인 파일을 업데이트하는 것입니다. 이전에 CodeCentral의 원본 Delphi CGI 버전을 작성했을 때 누군가가 파일을 다운로드하고 올바른 이름으로 새 파일을 작성한 다음 최종적으로 파일을 정리하더라도 기존 파일의 이름을 바꿀 수 있다는 사실을 모호하게 기억합니다.

그러나 현재의 IIS 6 및 ASP.NET 2.x 또는 3.x 코드에서는 작동하지 않기 때문에 망상 일 수 있습니다. 그래서, 우리가 대신 수행 한 것은 매우 미봉책 인이하지만 결국 작동합니다

public static void FileCreate(Stream AStream, string AFileName, int AWaitInterval) 
{ 
    DateTime until = DateTime.Now.AddSeconds(AWaitInterval); 
    bool written = false; 
    while (!written && (until > DateTime.Now)) 
    { 
    try 
    { 
     using (FileStream fs = new FileStream(AFileName, FileMode.Create)) 
     { 
     CopyStream(AStream, fs); 
     written = true; 
     } 
    } 
    catch (IOException) 
    { 
     Thread.Sleep(500); 
    } 
    } 
} 

나는 우리가 간단하게 뭔가를 놓치고 생각하고, 현재있는 파일을 대체하는 더 나은 방법이있을거야 IIS와 ASP.NET을 통해 다운로드됩니다. 거기 있니?

답변

2

나는 우리가 다음과 같은 논리로이 문제를 해결하는 것 같아요 :

우리는 파일이 업데이트 날짜/시간을 저장합니다. 데이터 기반 파일 이름 "[id] .zip"을 업데이트 할 수없는 경우 대신 "[id] _ [modified] .zip"을 만들고 이름을 바꿀 수있을 때까지 사용합니다. "[id] .zip"파일의 이전 버전을 삭제하십시오.

그런 식으로, 우리는 항상 "[id] .zip"을 찾기 전에 "[id] _ [modified] .zip"을 찾고 최신 파일을 보장하며, "표준" "[id] .zip"버전을 마침내 대체 할 수 있기 전에 수정 된 여러 버전이있을지라도 요청시와 백그라운드에서 모두 루틴을 사용할 수 있습니다.

물론 이것은 파일을 마지막으로 저장 한 경우에만 작동하지만이 유형의 기술을 사용하는 시스템은 그래야합니다.

0

존, 상황에 대해 좀 더 자세히 설명해 주시겠습니까?

파일이 충분히 작 으면 전체 파일을 메모리에로드 한 다음 클라이언트로 보낼 수 있습니다.

아마도 blog post about downloading and deleting temporary files이 조금 도움이 될 것입니다.

+1

Greg에게 문의 해 주셔서 감사합니다. 이들은 500MB 이상의 대용량 파일입니다. 또한 임시 파일이 아니라 때로는 업데이트해야하는 파일입니다. 대부분의 파일은 변경되지 않지만 변경 될 때마다 새 버전으로 대체 할 수 있어야합니다. 귀하의 질문에 다시 생각해보십시오. 아마 우리는 파일에 버전 스탬프를 삽입하고 그런 식으로 해결할 수 있습니다. –