|
| Posted by Anonymous | 2002-09-17 00:48:03, Hit : 4807 | |
|
|
|
제가 쓰는 글 특성상 존댓말은 거의 안나옵니다 ;;
제가 싸-_-;가지 없다고 생각하시고 그냥 읽으시길...
보시고 감상이나(ex. 에잇 이런 쓰잘데기 없는 것이나 생각하다니! 공부나 햇!)
고칠점 (ex. 숫자 오타인데요...;;), 질문 (ex. 저거 돌아가긴 하나요?) 등을 달아주세요.
-----------------------------------
창조 자체로 많은 파일 압축하기 (구상)
-----------------------------------
물론 zip, rar, ace 등등 많은 압축파일 형식처럼 파일 하나로 모두 해결할 수 있다면 얼마나 좋을까만은 ;; 그건 절대 불가능하다. (파일 갯수가 하나인거랑, 파일 갯수가 천개인 것과는 서로 헤더 용량이 틀릴 수 밖에 없기 때문이다. 그렇다고 파일 갯수를 제한한다면 그건 압축 프로그램이 아니지 ;;)
먼저 a.txt, b.txt, c.txt가 있다고 하자. (예일뿐이다.)
파일 목록을 리스트 박스에 다 싸잡아놓고, 바이트를 계산한다.
a.txt - 1000 byte
b.txt - 1234 byte
c.txt - 4321 byte
* 예가 상당히 조악하지만 -_-;;; 알아서 듣고 넘어가기 바란다.
그러면 이제 파일을 합친다. 도스창을 띄우든 파일을 열어서 써넣든 간에 그건 자유다.
(중요한 것은 객체로 열면 바이너리 파일은 깨진다. -_-)
합친 파일은 compress.tmp 라고 하자. 총 합은 6555 byte이다. (덧셈)
환경정보 파일이 필요한데, 왜냐하면 일반 파일 액세스보다 간편하기 때문이다. -_-;;
파일 이름에 따라 계산할 필요도 없고 (구분자를 쓰면 되니까)...
(파일 액세스 할 줄 아는 사람은 그걸 쓰도록... 쿨럭)
명령어를 써서 아래처럼 만들자. 파일 이름은 complete.cfi라고 하자. (Compressed File Info)
[Info]
filename = complete.ccf
TOTAL = 3
1 = "a.txt|0|1000"
2 = "b.txt|1001|1234"
3 = "c.txt|1235|4321"
TOTAL은 전체 파일 갯수이다.
"a.txt|0|1000"은 첫번째로 a.txt 파일이 있고, 총 1000 바이트라는 것을 가리킨다. 그리고 0바이트, 맨 처음 바이트부터 시작한다는 것. '|' 문자는 파일 명에 들어갈 수 없으므로 구분자로 적당하다, ':'을 써도 무방하다. 물론 쪼개는 함수는 따로 만들어야 하겠지만. 구조체가 지원하지 않아 이때 불편하다.
(그런데 코딩에 따라 저기서 오류가 발생할 수도 있다. 적당한 값을 찾길)
그 다음 compress.tmp를 압축해버리자. 파일 용량이 줄면 주는 것이요 늘면 느는 것이니 ;
중요한건 방법이지 바이트 수가 아니다 ;;; (돌은 내려놓으시길.)
압축한 파일은 뭐... complete.ccf 라고 해두자. (Createall Compressed File... ;;;)
자 그러면 이제 파일 두개가 생긴다.
complete.cfi와 complete.ccf. (못 뜯어보게 cfi를 압축하건 안하건 그건 멋대로다 -_-)
파일 풀때는 역으로 하면 된다. 문제는 파일 두개가 있어야 한다는 점 뿐. -_-)
해제 프로그램을 만들때에는 bin/cue 쓰듯이 하면 될듯하다. cfi 파일을 열면
파일 갯수, 확장자, 바이트, 순서 (번호)가 나오니 그걸로 목록을 만들고, 풀 파일은 다 풀면 모르되
파일 하나만 풀면, 예를 들어 b.txt를 풀면 일단 ccf를 풀어낸 다음에 1001바이트부터 1234 바이트까지 읽어오면 되는 것이다. 이것은 별 수 없이 파일 제어를 사용해야 할 듯하다. (웬지 TAR+GZIP이 생각나는 이유는?)
효율이 있는지 없는지는 중요하지 않다. 중요한건 이런것도 가능하다는 것이지...
아마도 작은 텍스트 파일 다수를 압축하거나 할때에는 유용하게 쓰일지 모르겠으나
큰 바이너리 파일 다수를 압축하는 것은 포기하는게 좋을듯 싶다. (-_- 당신의 컴은 슈퍼컴퓨터인가? 아니면 인내심이 강한가...)
노턴안티바이러스를 보면 오토 업데이트로 인터넷에서 파일을 받아 백신을 업그레이드 하는데
그것처럼 텍스트 파일을 받아 기능상 업그레이드를 할 필요가 있다면, 그리고 이 이론(?)을 바탕으로
소스가 만들어진다면 한번 써보라고 권유는 해보고 싶다. (왜? 일단 이론은 내가 만들었으니까 -_-;;)
----------------
여기서 추가.
파일 하나로도 해결할 수 있는 방법이 있긴 하다. 하지만 골아프다.
헥스코드를 이용하는 방법인데,
위의 방법에서 Complete.ccf와 complete.cif 를 더한 다음 -_-;; (또 더하냐?)
(물론 다시 압축할 필요는 없다. 하지만 complete.ccf와 complete.cif를 압축하지 않았다면
압축하길 권장한다. 쉽게 뚫리는 구조기 때문이다.)
맨 뒤에 4바이트를 써서 complete.ccf가 끝나는 위치를 기록하는 방법이다.
FF FF FF FF (4바이트의 최대값 헥스표시. 256의 4 제곱의 값이니 4,294,967,295... 사십이억 구천사백구십육만 칠천이백구십오 바이트! 헉헉... ) 으로 표시한다면, 약 4096메가바이트 (아까 저 숫자를 복사한 다음 1,048,576 백사만 팔천오백칠십육 바이트로 나눠보라.)까지 기록이 가능하다. (쿨럭) 3바이트면 16M까지. 2바이트면 65K까지 표현가능하다.
이렇게 한다면 순서는 조금 바뀔것이다.
1. 파일을 열어 맨 끝 4바이트를 읽는다.
2. 헥스→데시멀 (10진) 변환.
3. 위치 계산 (간단할지도 ;;)
4. 파일 위치 이동 (ccf파일 끝나는 곳)
5. 읽어낸다 (파일 사이즈 -4 바이트까지. cif 파일 추출)
6. 목록을 짜고, 풀어낼 파일을 표시한 후 풀어낸다. (이게 가장 어려울듯하다)
* 주의할 것은 10→16진은 창조자체지원이지만 16→10진은 없다. 개발해야 하는 것이다.
전에 만들었었는데 제대로 기억이 안나는군 ;;; 시간 나면 만들어 올리기로 하고...
정작 말을 거창하게 해놓은 본인은 전혀 짜본적이 없으므로, 시간이 남아돌고
할 일이 정말로 없으며 자신의 프로그래밍 실력이 천상천하 유아독존이라 생각하시는 분은
도전해보시기 바람. 함수화한다면 더욱 좋겠지...만... 누가 해줄까나. |
|
|
지우개 Expert 3.0 제작자 : 천호성 님 [LINK] |
|
|
|
대박로또2005 제작자 : 최재일 님 [LINK] |
|
|
1 | 박종훈 님 | 15292 점 | |
2 | 지상현 님 | 8809 점 | |
3 | 손상진 님 | 7388 점 | |
4 | 권선중 님 | 6060 점 | |
5 | 이진백 님 | 5174 점 | |
|
|
|
가입일 | 닉네임 |
05/31 | 김동률 |
03/31 | 홍형기 |
09/01 | o00pp99oo |
12/27 | 이재민 |
11/20 | 이희철 |
|
|
|
|
. |
. |
. |
|