2009-07-04 46 views
8

Tôi có thể tạo Thư mục Nén (Nén) của Windows XP bằng Delphi không?Tạo Thư mục Nén (Nén) bằng Delphi

+1

gì "thuộc tính zip" bạn đang đề cập đến? Bạn có thể cụ thể hơn một chút không? –

+2

Tua nhanh 2 năm tới 2011: Delphi XE2 hiện có tàu với một lớp TZipFile được tích hợp vào RTL (xem System.Zip). Có lẽ ai đó thực sự sử dụng nó có thể đăng một câu trả lời về nó ở đây. –

+1

Đã thêm ví dụ về Delphi XE2. –

Trả lời

5

Theo chủ đề trong eggheadcafe, bạn có thể sử dụng CreateFile Function với FILE_FLAG_BACKUP_SEMANTICS để tạo Thư mục nén.

Đối với tuyến đường mở rộng vỏ, hãy xem Using Windows XP "Compressed Folder" shell extension to work with .zip files bởi Không gian tên Edanmo, được viết bằng VB.

Tôi vừa tìm thấy câu hỏi tương tự được hỏi trên C++. Hãy xem Creating a ZIP file on Windows (XP/2003) in C/C++. Tôi có cảm giác con đường dễ nhất là mua ZipForge. Xem Zip a file in Delphi code sample.

1

Bạn có thể sử dụng một số phiên bản dòng lệnh của bất kỳ máy nén nào như 7zip và thực hiện tác vụ bằng ShellExecute hoặc bạn có thể sử dụng thành phần miễn phí hoặc comercial như bất kỳ ai trong số these.

Tôi đã sử dụng ZipMaster và nó hoạt động rất tốt cho mục đích của tôi. Tôi không biết yêu cầu về kích thước, không gian và hiệu suất của bạn là bao nhiêu.

+0

Tôi hiện đang sử dụng nó, phù hợp với nhu cầu của tôi. –

4

Một số thời gian trước đây, tôi đã thử tất cả các thư viện nén Delphi rằng tôi có thể tìm thấy, và cuối cùng tôi đã kết thúc lên bằng cách sử dụng KaZip bởi Kiril Antonov.

Yêu cầu của tôi là:

  • miễn phí;
  • Nguồn mở;
  • Mã Delphi gốc;
  • Không có phụ thuộc bên ngoài (dll, exe). Yêu cầu quan trọng nhất của tôi;
  • Dấu chân bộ nhớ nhỏ;
  • Dễ sử dụng;

Tôi sử dụng chủ yếu để chuyển các tệp .kml thành tệp .kmz và nó hoạt động nhanh đến đáng ngạc nhiên.

Dưới đây là một ví dụ về cách tôi sử dụng nó:

uses 
    KaZip; 

... 

// replaces a .kml file with a .kmz file 
procedure KmlToKmz(const aFileName: string); 
var 
    FS: TFileStream; 
    KaZip:TKaZip; 
    KmzFileName:TFileName; 
begin 
    KmzFileName := ChangeFileExt(aFileName, '.kmz'); 
    KaZip := TKaZip.Create(nil); 
    try 
    // create an empty zipfile with .kmz extension: 
    FS := TFileStream.Create(KmzFileName, fmOpenReadWrite or FmCreate); 
    try 
     KaZip.CreateZip(FS); 
    finally 
     FS.Free; 
    end;   

    KaZip.Open(KmzFileName); // Open the new .kmz zipfile 
    KaZip.Entries.AddFile(aFileName); // add the .kml 
    KaZip.Close; 
    DeleteFile(aFileName); // delete the .kml 
    finally 
    KaZip.Free; 
    end; 
end; 
+0

đối tượng "Tự do" cuối cùng áp dụng đối tượng nào? Tôi đoán là KaZip, nhưng tôi không có đại diện để chỉnh sửa. – Argalatyr

+0

Ah, có KaZip nên được giải phóng ở đó .. Cố định nó .. Tôi làm sạch mã này lên trong trình soạn thảo văn bản của trang này để làm cho nó dễ dàng hơn một chút để đọc .. Tôi đoán tôi nên đã kiểm tra nếu nó vẫn hoạt động :) –

2

A "nén" thư mục trong Windows là gì khác hơn là một tập tin ZIP nén sử dụng bất kỳ thư viện zip tiêu chuẩn. Thư mục nén là một động vật khác và yêu cầu định dạng đĩa NTFS.

Đối với tệp "Zip", tôi đề xuất rõ ràng Turbo Power Abbrevia, là nguồn mở và hoạt động tốt. Bạn có thể muốn kiểm tra trang web này alternate nếu bạn sử dụng Delphi 2009 vì nó có thể là một bản sao mới hơn.

Nếu bạn muốn sử dụng tùy chọn thư mục nén, bạn sẽ cần sửa đổi cờ thư mục trên tay cầm thư mục.Điều này sẽ chỉ ảnh hưởng đến các tệp MỚI được thêm vào thư mục đó và sẽ không tự động nén các tệp hiện có. Nếu bạn có một thư mục hiện có mà bạn đang cố gắng nén, sau đó đổi tên từng tệp hiện có và tải và lưu nó trở lại tên gốc xóa tệp gốc khi hoàn tất với mỗi tệp. Yozey có liên kết tốt với tài liệu MSDN. Chỉ cần nhớ rằng điều này chỉ hoạt động với các định dạng đĩa NTFS, vì vậy bạn sẽ cần phải thêm một kiểm tra cho điều đó trong mã của bạn.

3

Hãy xem điều này OpenSource SynZip unit. Nó thậm chí còn nhanh hơn để giải nén hơn so với các đơn vị mặc định được vận chuyển với Delphi, và nó sẽ tạo ra một exe nhỏ hơn (các bảng crc được tạo khi khởi động).

Không có dll bên ngoài là cần thiết. Hoạt động từ Delphi 6 lên đến XE. Không có vấn đề với phiên bản Unicode của Delphi. Tất cả trong một đơn vị duy nhất.

Tôi vừa thực hiện một số thay đổi để xử lý tên tệp Unicode bên trong nội dung Zip, không chỉ bộ ký tự Win-Ansi mà còn bất kỳ ký tự Unicode nào. Phản hồi được hoan nghênh.

+0

bạn có thể đưa ra một ví dụ để sử dụng 'SynZip'? từ [example] (http://synopse.info/forum/viewtopic.php?pid=163) làm thế nào để nén một thư mục? – PresleyDias

11

Nếu bạn đang sử dụng Delphi X2, chỉ cần sử dụng TZipFile từ System.Zip:

Để Zip một thư mục, sử dụng:

TZipFile.ZipDirectoryContents('ZipFile.zip', 'C:\Zip\this\right\now'); 

Để Zip file, sử dụng:

Zip := TZipFile.Create; 
try 
    Zip.Open('ZipFile.zip', zmWrite); 

    Zip.Add('FileToBeZipped.txt'); 
    Zip.Add('ThisWillBeCompressedAgainForSureAndBecomeSmaller.zip'); 
finally 
    Zip.Free; 
end 
+0

sử dụng tính năng này để nén một thư mục nhưng vẫn tiếp tục nhận được "Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác. Tôi không chắc chắn cách truy cập của nó? Tôi giải phóng danh sách tôi có với tất cả các iamges trong thư mục. Bất cứ cách nào để xem những gì đang truy cập nó? hoặc bất kỳ cách nào để đóng những gì bao giờ được truy cập nó ..? cảm ơn –

+0

@GlenMorse Sau 3 năm tôi đọc anser này.Các chức năng đầu tiên có thể không làm việc. mã zip nhưng chỉ với tệp đầu tiên, có thể chức năng đó đang chặn chính nó.Sử dụng aproach thứ hai, nó hoạt động tốt –

+0

phiên bản đầu tiên hoạt động Bạn chỉ cần thoát ra khỏi con đường của riêng mình. ('.. \ ZipFile.zip', 'C: \ Zip \ this \ right \ now'); –

Các vấn đề liên quan