PDA

View Full Version : Làm sao nén được nhiều tập tin & thư mục ?



ngo_rung
16-11-2004, 03:09
Mình đã cài xong thuật toán nén Huffman dùng để nén 1 tập tin rồi nhưng bây giờ không biết nếu muốn nén nhiều tập tin hặc nhiều thư mục vào 1 tập tin thì phải làm sao ?
Ngoài ra, mình cũng muốn người dùng có thể xem trong tập tin nén đó của mình có những thư mục, tập tin nào và khi người ta chọn 1 tập tin văn bản (text thường thôi) thì chương trình sẽ hiển thị nội dung tập tin đó cho người ta xem (bằng NotePad chẳng hạn).
Ai biết xin chỉ dùm cái. Cám ơn rất nhiều !

bete
16-11-2004, 06:20
Thân gửi ngo_rung: bạn thử như vậy coi có được không nghen:
giả sử bạn có n tập tin: f_1, ....,f_n
Kích thước các tập tin này (tính theo byte) là kich_thuoc_1, ..., kich_thuoc_n
=> mình nén liên tục nối nhau tất cả các tập tin vô 1 tập tin gọi là du_lieu. Lưu ý một điều là khi nén: nếu byte cuối của tập tin f_k không xài hết 8 bit thì tập tin kế f_k+1 mình cứ chơi sang: bắt đầu từ byte kế tiếp (cho nó gọn)

Đồng thời mình tạo 1 danh sách các mẫu tin gồm 3 trường: tên tập tin, bắt đầu & kết thúc. Cứ nén xong 1 tập tin fk thì cập nhật danh sách này: tên tập tin là f_k, bat_dau_k là vị trí của byte đầu tiên ở trong du_lieu, ket_thuc_k là vị trí của byte cuối ở trong du_lieu

Cuối cùng, khi nén hết tất cả các tập tin thì mình có 2 tập tin danh_sach & du_lieu
=> nối lại với nhau (nếu thích thì nén danh_sach, còn không thì cứ giữ như là tập tin văn bản thông thường) thành 1 tập lớn: cuoi_cung. Nhớ viết vị trí bắt đầu của du_lieu (tương ứng trong tập tin cuoi_cung) ngay đầu của cuoi_cung

Tóm lại, cấu trúc của tập tin cuoi_cung đại khái là:

vị_trí_bắt_đầu_của_dữ_liệu (m byte)
danh_sách (nén hay không nén cũng được)
dữ_liệu (nén: hợp của tất cả các f_k)

Viết rõ thêm 1 tí:

danh_sách: (f_1,bat_dau_1,ket_thuc_1), (f_2,bat_dau_2,ket_thuc_2), ...,(f_n,bat_dau_n,ket_thuc_n)
dữ_liệu: f_1_nén, f2_nén, ..., f_n_nén

=> biết tên 1 tập tin f_k => tìm trong danh sách => bat_dau_k & ket_thuc_k => giải nén phần dữ liệu (chỉ giải nén trong khoảng bat_dau_k đến ket_thuc_k)

(có gì sai sót mong các bạn chỉ giúp, xin cám ơn rất nhiều)

-thân