2013-04-22 4 views
1

압축 컴포넌트 (예 : KAZip, JVCL, zLib)를 사용하고 파일을 압축하는 방법을 정확히 알고 있지만 여러 개의 폴더를 하나의 단일 아카이브로 압축하고 추출 후 폴더 구조를 유지하려면 어떻게해야합니까? 난 그냥 압축 파일의 목록을 줄 수있는 모든 구성 요소에여러 폴더를 하나의 아카이브로 압축하는 방법은 무엇입니까?


, 내가 추출 할 폴더의 구조체를 줄 수는 (또는 내가 찾을 수 없습니다)해야합니다 모든 파일을 알 수있는 방법이 없습니다 추출 여기서

난 폴더 FOLDER_A에 myText.txt라는 이름의 파일을 가지고 폴더 FOLDER_B에서 같은 이름의 myText.txt을 가진 파일이 : 난 압축 파일의 목록을 제공 할 수 있습니다

| 
|__________ FOLDER_A 
| |________ myText.txt 
| 
|__________ FOLDER_B 
| |________ myText.txt 
| 

을 : myList에를 (myText.txt, myText.txt)하지만 압축 할 수없는 파일 구조를 제공하지, 무엇이 가장 좋은 방법입니다 어떤 파일이 어떤 폴더에 속하는지 찾았습니까?

+2

정확히 무엇을 하시겠습니까? 어떤 형식을 찾고 계십니까? FWIW 가장 좋은 도구는 tpAbbrevia입니다. –

+0

질문이 더 명확하도록 수정되었습니다. tpAbbrevia는 UTF 파일 이름을 지원합니까? – Armin

+1

글쎄, 난 아직도 tpAbbrevia를 사용하고 싶다. 아카이브 형식이 실제로 마음에 드십니까? 그게 내가 얻었던거야. 다양한 형식이 많이 있습니다. 어떤 압축이 가능합니까? tar + gzip은 어떻습니까? 괜찮을까요? –

답변

4

zip 형식에는 폴더가 없습니다. 글쎄, 그렇긴하지만 그들은 빈 자리 표시 자이며 사용자 액세스 권한과 같은 메타 데이터 저장소가 필요한 경우에만 삽입됩니다. 그러나 그보다 드문 고급 것들 이외에는 폴더가 전혀 필요 없습니다. 실제로 완료된 것 - 메모장에서 zip 파일을 열어서 끝까지 스크롤 할 때 관찰 할 수있는 것은 각 파일의 경로가 "아카이브 루트"부터 시작한다는 것입니다. 사용 된 구분이 참 슬래시는 것을,

  • FOLDER_A/myText.txt
  • FOLDER_B/myText.txt

참고 : exanple에서 zip 파일은 두 개의 항목 (두 개의 파일을)해야한다 DOS/Windows 환경에서 사용되는 백 슬래시가 아니라 UNIX 세계에 공통적입니다. 어떤 라이브러리는 당신을 위해 백 슬래시를 고쳐 줄 것이며, 일부 라이브러리는 테스트를 수행하지 않습니다.

이제 해당 트리가 D:\TEMP\Project에 포함되어 있다고 가정 해 봅시다.

  • D : \의 TEMP \ 프로젝트 \ FOLDER_A \ myText.txt
  • D : \의 TEMP \ 프로젝트 \ FOLDER_B \ myText.txt

(경로 구분 이외의)이 개 더 많은 질문이 있습니다 : D:\TEMP\Project\ 안에 더 많은 폴더가 있어야합니다 (예 : D:\TEMP\Project\FOLDER_C\*.*?). zip 라이브러리에 폴더를 내부 서브 폴더와 파일로 채우는 직접 API가 있거나 파일별로 수행해야합니까?

세 퀘스트 ns 당신은 자신에게 물어보고 도서관을 선택하는 동안 확인해야합니다. 코드 초안은 다소 다릅니다.

은 이제 라이브러리를 위해 자신을 제도 시작하자 :


기본 변형 그냥 델파이 자체를 사용하고 있습니다.

  1. 폴더에있는 파일을 열거 :
  2. absolute paths에서 해당 열거 결과는 다음 처음부터 일반 D:\TEMP\Project을 제거하면 http://docwiki.embarcadero.com/CodeExamples/XE3/en/DirectoriesAndFilesEnumeraion_(Delphi) : If AnsiStartsText('D:\TEMP\Project\', filename) then Delete(filename, 1, Length('D:\TEMP\Project\')); 같은 것을. 선택한 장소를 기준으로 경로를 가져야합니다. 특히 전체 경로를 압축하지 않고 아카이브에서 FOLDER_C 일부만 살면됩니다.
  3. 어쩌면 당신은 또한 변경 StringReplace를 호출해야 '\' '/'로 파일 이름에
  4. 는 당신은 http://docwiki.embarcadero.com/Libraries/XE2/en/System.Zip.TZipFile.Add을 사용하여 압축 할 수 있습니다 - 상기 FOLDER_A/myText.txt

처럼 올바른 상대 ArchiveFileName를 지정하는데주의를 기울여야 ZipMaster 라이브러리를 사용할 수 있습니다. 그것은 매우 VCL 바인딩이며 스레드 또는 DLL을 사용하여 문제를 일으킬 수 있습니다. 그러나 간단한 응용 프로그램의 경우 작동합니다. http://www.delphizip.org/

마지막 버전 페이지에는 소스, 도움말 및 데모가 모두있는 "설치"패키지에 대한 링크가 있습니다. 데모 중에는 폴더를 저장할 수있는 모든 기능을 갖춘 아카이브 브라우저가 있습니다. 따라서 코드를 직접 읽을 수 있습니다.


http://www.delphizip.org/191/v191.html 당신은 이미 제다이 CodeLib 설치 한 의미, JVCL에 대해 이야기했다. 그리고 JCL에는 적절한 클래스와 함수가 있습니다. 이름으로 판단하면 직접 원하는 것을 할 수 있습니다 : function TJclSevenzipCompressArchive.AddDirectory(const PackedName: WideString; const DirName: string = ''; RecurseIntoDir: Boolean = False; AddFilesInDir: Boolean = False): Integer;

실제로 모든 라이브러리는 기본 레벨에서 비슷합니다. XLSX 내보내기를 만들었을 때 방금 제복을 만들었습니다. zipping API를 사용하여 실제로 압축 엔진을 설치하는 데 아무런 차이가 없습니다. 그러나 디스크상의 파일이 아닌 메모리 내 TStream에서 작동하므로 직접적으로 도움이되지 않습니다. 하지만 난 그저 지하실 수준에서 몇 가지 단점 (즉각적인 대 지퍼 연기 같은)의 별개의 모든 libs가 동일하게 작동하는 것을 배웠습니다.

+0

+1 좋은 답변입니다. –

+0

@Arioch '감사합니다. 가장 완벽하고 자세한 답변 중 하나 인 zipMaster를 사용해 보았지만 스레드 나 DLL 문제가 있다고 말했지만 JCL은 아무 문제없이 잘 작동했지만 몇 가지 런타임 설정을 지정해야합니다. – Armin

+0

@ 아르 민. 천만에요. WinXP 네이티브 지퍼가 있지만 코드 샘플은 일반적으로 VB 나 C# 용이며 어렵지는 않지만 델파이로 변환합니다.하지만 다소 지루합니다. –