2011-08-03 3 views
0

TIdHTTP.Get을 사용하여 파일을 다운로드하고 있습니다. 매개 변수로 나는 TFileStream 객체를 전달하고 있는데, get 메소드를 실행하면 다운로드가 완료되기 전에 파일 크기가 한 번에 할당된다는 것을 알았습니다. 내 질문은 How I can avoid which the TIdHTTP component allocate all the file size in the disk at once when use Get?Getd를 사용할 때 TIdHTTP 구성 요소가 한 번에 모든 파일 공간을 할당하지 않도록하는 방법은 무엇입니까?

+0

디스크 공간이 부족할 때 무엇을하고 싶습니까? 다운로드를 통해 75 % 이상 실패합니까? 사전 할당은 이유가있을 수 있습니다. –

+0

@Warren - 동의합니다 (예 : 파일 관리자에서이 점을 싫어합니다.).하지만 충분한 공간이 없을 때 반대 상황을 상상해보십시오. 다운로드 프로세스 중에 일부는 무료로 제공됩니다. 그리고 [Content-Length] (http://tinyurl.com/Content-Length)는 헤더에 포함되면 안되므로 파일 크기는 미리 알 수 없습니다. 나는이 상황이 인디에서 어떻게 처리되는지를 조사하지 않았다. –

+3

@daemon : 사전 할당은 최적화이지만 요구 사항은 아닙니다. Indy의 코드에는 미래에 해당 기능을 사용자 정의 할 수 있도록 TODO 항목이 있으므로 최종적으로 발생할 수 있습니다. 'TIdHTTP'는'Content-Length'가 없거나 사용되지 않을 때 이미'chunked' 다운로드를 지원합니다.이 경우 사전 할당은 일어나지 않습니다. –

답변

0

레미가 언급 한 것처럼 응답 크기는 미리 알려지며 (Content-Length 헤더 멤버에서) Indy는 항상 전체 스트림 크기를 미리 할당합니다.

따라서 디스크 공간 할당을 피하는 유일한 방법은 메모리 스트림을 사용하고 해당 스트림의 데이터를 진행중인 파일로 복사하는 것입니다.

디스크에 전체 다운로드 파일 크기를 미리 할당하는 것이 유용합니다. 파일을 메모리 스트림으로 다운로드해도 하드 드라이브에 충분한 공간이 필요하기 때문입니다. 물론 다운로드 자체를위한 충분한 여유 메모리). 메모리 스트림을 사용하면 몇 가지 디스크 공간을 확보 할 시간을 확보 할 수 있다는 장점이 있지만, 사용자가 할 일에 따라 크게 달라집니다.

관련 문제