2010-12-01 2 views
5

빌드하는 애플리케이션과 함께 제공해야하는 작은 파일이 많습니다.이 파일을 복사하여 재배포하기 위해 아카이브에 넣고 싶습니다. 뭔가 잘못되었을 때를 대비하여 한 파일의 md5를 비교해야하기 때문에 한 곳에서 모든 파일을 가지고 있다는 생각을 정말 좋아합니다.쉽게 액세스 할 수있는 C++ 파일 컨테이너 (예 : zip)

아카이브에로드해야하고 아카이브에 파일 목록을 반환하고 파일에 액세스해야하는 경우 파일을 메모리에로드 할 수있는 클래스가 있다고 생각합니다.

나는 인터넷에서 zlib와 lzma sdk에 대해 원하는 것을 얻고 다른 방법을 찾았습니다. 두 가지 모두 정말 매력이 없었습니다. 휴대용 zlib이 무엇인지 알지 못했고 lzma sdk가 마음에 들지 않았습니다.이 때문에 응용 프로그램을 폭파하고 싶지 않습니다. 문제. zlib의 또 다른 단점은 매뉴얼에 설명 된 모든 것을 얻으려면 C/C++ 경험이 없다는 것입니다.

또한 시간이 중요한 문제라고 덧붙여 야합니다. 비록 응용 프로그램 내에서 파일에 쉽게 액세스 할 수있는 방식으로 tar와 같은 간단한 형식을 구현하는 데는 다소 시간이 걸리지 만 아직 그 작업을 수행 할 시간을 찾지 못했습니다.

그래서 내가 검색하고 싶은 것은 아카이브 내의 파일에 액세스 할 수있는 라이브러리입니다. 아무도 여기에 올바른 방향으로 나를 가리킬 수 있다면 기뻐할 것입니다.

미리 감사드립니다. 로빈.

편집 : linux 및 windows에서 아카이브에 액세스해야합니다. 미안해, 처음에는 언급하지 않았다.

답변

2

답변은 아카이브를 처음 작성한 후 코드를 통해 아카이브를 수정할지 여부에 따라 달라집니다.

수정이 필요하지 않은 경우 TAR을 사용할 수 있습니다.이 형식은 편리하고 간단한 형식입니다. 압축을 원하면 tar.gz 리더를 구현하거나이 작업을 수행하는 라이브러리를 찾을 수 있습니다 (오픈 소스 라이브러리를 포함하여 일부 사용 가능하다고 생각합니다).

응용 프로그램에서 데이터에 임의 액세스해야하거나 아카이브를 수정해야하는 경우 일반 TAR 또는 ZIP 아카이브는 좋지 않습니다. SolFS 또는 CodeBase 파일 시스템과 같은 가상 파일 시스템은 훨씬 더 잘 맞을 것입니다. 가상 파일 시스템은 저장소를 자주 수정하는 데 적합하며 아카이브는 주로 write-once-read-many 사용 시나리오를 대상으로합니다.

+2

그럼 Zip만으로도 충분 하겠지만 VFS 용어를 전혀 보지 않았습니다. 나는 PhysicsFS를 발견했으며 이것이 내 프로젝트에 정확히 사용할 것이라고 생각한다. 답변 해 주셔서 대단히 감사합니다. – Robin

2

zlib은 휴대 성이 뛰어나고 널리 사용됩니다. C++ 인터페이스를 이해할 수 없다면 다른 많은 언어에 대한 대안이 있습니다 - '관련 외부 링크'here을 참조하십시오.

다른 것을 검색하기 전에 다시 한 번 살펴보십시오.

+1

그러나 'zlib'은 OP가 보관하고 싶은 것을 수행하지 않습니다. 압축은 수행하지만 자체적으로 .zip 파일 형식을 이해할 수는 없습니다. –

+0

예, 압축은 초당 필요할뿐입니다. 내가 주로 필요로하는 것은 수백 개의 작은 파일을 하나의 파일로 그룹화하는 것입니다. – Robin

2

Qt 또는 Windows를 사용하는 경우 실행 파일의 리소스 영역에 데이터를 압축 할 수도 있습니다. 이 기술을 사용하여 실행 파일 만 배포하면됩니다. 해당 데이터에 액세스하기 위해 이미 작성되고 테스트 된 잘 정의 된 API가 있습니다.

3

압축을 위해 저는 항상 ZipUtils 부분적이었습니다. 프로세스가 쉬우 며 zlib 및 info-zip 라이브러리 위에 구축되었습니다.

+0

링크 메이트에게 감사 드려요.하지만 Windows와 Linux에서 실행해야합니다. ZipUtils는 창에서만 작동합니다. – Robin

+0

@ 로빈 : 그걸 질문에 넣어 주시겠습니까? :) 감사! –

0

zlib API는 사용할 수있는 방법입니다. 간단하고 휴대 가능합니다. 아카이브 파일에 액세스하는 API를 보려면 unzip.h 헤더를 참조하십시오. 그것은 C로 매우 쉽습니다.

파일이 작은 경우 문자열 리터럴 (bin2h 유틸리티 검색)에 파일을 덤프하고 프로젝트에 포함 할 수 있습니다. 그런 다음 파일을 읽는 코드를 변경하십시오. 모든 파일이 현재 ifstream 클래스를 사용하여 읽혀지면 코드를 istringstream 클래스로 변경하고 코드를 다시 컴파일하기 만하면됩니다.

0

Quazip을 사용해보세요. 매우 간단합니다. 압축 된 파일을 즉시 읽을 수있는 스트림으로 사용할 수 있습니다.

+0

제안 해 주셔서 감사합니다.하지만 콘솔 응용 프로그램을 qt 종속성으로 확장하고 싶지는 않습니다. – Robin