Få Zip Funksjonalitet for Free

Leter du etter en måte å integrere zip og pakk funksjonalitet i din søknad på billig? Her er planen-og Fernando Vicaria har selv pakket det hele opp i en pen liten komponent for deg!
Denne artikkelen opprinnelig dukket opp i Delphi DeveloperCopyright Pinnacle Publishing, Inc. Alle rettigheter reservert.
Du trenger en del av funksjonaliteten. Kjøper du en komponent eller rulle opp ermene og begynne i på design selv? Veldig ofte kan du finne et freeware komponent som gjør jobben. Dessverre er det også vanlig at disse komponentene ikke kommer med kilde eller er mindre enn perfekt. Og hvis du er som meg, hater du å legge noe til din søknad som ikke kommer med kildekoden eller ikke er blitt fullstendig tested.If en ekstra funksjon du trenger er evnen til å komprimere eller dekomprimere filer ved hjelp av industri standard zip-format, så du er på hell! WinZip 7.0 (og nyere versjoner) har nå sin egen kommandolinje støtte. Denne utrolig nyttig add-on er tilgjengelig for nedlasting fra Nico Mak Computing Inc. på sin hjemmeside: http: //www.winzip.com.What's så stor om en kommandolinje? Tenk på det. Nå kan du bygge en komponent for å ringe kommandolinje program, og alle dine problemer vil bli løst! Her er én måte å gjøre nettopp that.Getting WinZipFirst av alt, må du installere WinZip 7.0. Hvis du al-klar har en annen versjon av WinZip, kan oppgraderinger lastes ned gratis fra nettadressen jeg bare mentioned.Once du har den nyeste versjonen, er neste skritt å laste ned og installere kommandolinje add-on. Når du har dem begge installert, sørg for at de har blitt lagt til din path.Now hvis du kunne bygge en komponent for å ringe kommandolinje program og passere de riktige instruksjonene for å utføre WinZip, som ville gjøre å komprimere og dekomprimere filer i din søknad enkelt! en nummerert type og de declarationThis er et typisk eksempel på hva OOP (og, mer spesifikt, Delphi) handler om. Det første du bør gjøre er å lage en nummerert typen der du kan angi hvilken retning du ønsker å gå (komprimere eller dekomprimere): TZipState = (zsCompress, zsDecompress); Denne typen vil la deg bytte mellom de to mulige handlinger av komponenten. Oppføring 1 viser komponent erklæring Oppføring 1. kompresjon /dekompresjon komponent erklæring
TFVWinZip = klasse (TComponent) private {felleserklæringer} FFileName: string;.. FUseFileList: boolean; FFileList: TStringList; FZipFileName: string; FZipState: TZipState; FOnExecute: TNotifyEvent; funksjon GetFileList: TStringList; Prosedyren SetFileList (verdi: TStringList); prosedyre CreateCompressBat; publisert {Publisert erklæringer} eiendom Filename: string lese FFileName skrive FFileName; Eiendommen UseFileList: boolsk lese FUseFileList skrive FUseFileList standard False; Eiendommen Filelist: TStringList lese GetFileList skrive SetFileList; Eiendommen ZipState: TZipState lese FZipState skrive FZipState; Eiendommen ZipFileName: string lese FZipFileName skrive FZipFileName; Eiendommen OnExecute: TNotifyEvent lese FOnExecute skrive FOnExecute; offentlige {offentlige erklæringer} konstruktør Opprette (AOwner: TComponent); styre; destructor Destroy; styre; prosedyre Execute; enden, de fleste av sine egenskaper og metoder bør være selvforklarende. Du finner full implementering i filen FVWinZip.pas.Implementation declarationsIf du ser i begynnelsen av gjennomføringen delen av koden, vil du se den følgende kode: {$ R FVWinZip.res} konst BatchFile = 'tfvzip.bat '; Zip = 'wzzip'; Pakk = 'wzunzip'; Listname = 'zipit.lst'; Den første linjen bør være godt kjent for de som brukes til å lage sine egne komponenter. Den angir ressursfilen som inneholder ikonet for vår komponent. Du kan lage og designe dine egne ikoner med noen ressurs editor (i Delphi, er standard Imagedit.exe, som kan bli funnet i bin-katalogen) .De konstanter erklært her vil hjelpe deg å håndtere de ulike filene som brukes i prosessen med skape eller trekke våre zip-filer. BatchFile
er navnet på den satsvise filen vil bli skapt av vår komponent. Denne filen har ansvaret for å kalle en av zip-filer ( Zip
for komprimere eller Pakk
for dekomprimering). Den siste er listenavn, etter som er navnet på en tekstfil som inneholder en liste over filene som skal legges til Zip-filen samt kommandoer for kommandolinje program (omtrent som du ville gjøre i en batch-fil og DOS). Listname brukes kun når eiendommen UseFileList av vår Zip komponent er satt til sann og en gyldig liste over filer lagres i Filelist property.As jeg nevnte tidligere, dette er bare en av de mulige implementasjoner for komponent det er definitivt rom for forbedring. Ta en titt på den elektroniske hjelpefilen som følger med WinZip Command Line Support Add-on for mer information.The implementering codeThere er to viktige metoder i gjennomføringen delen jeg ønsker å beskrive for you.The første er prosedyren CreateCompressBat (se liste 2). I denne prosedyren, oppretter du en batch fil basert på brukerens behov. Den angir handlingen som skal utføres (komprimere /dekomprimere), navnet på filen for å komprimere, navnet på zip-filen, og om du bruker en liste fil eller ikke. Oppføring 2. CreateCompressBat . rutine
prosedyre TFVWinZip.CreateCompressBat, Div F: tekstfil; Command: string; begynne prøve hvis FzipState = zsCompress deretter Kommando: = Zip annet Command: = UnZip; {Opprett komprimere batch fil}
AssignFile (F, BatchFile); Omskriving (F); Writeln (F, 'ECHO OFF'); Writeln (F, 'REM *** TFVWinZip av F Vicaria ***'); hvis UseFileList deretter Writeln (F, Command + ' »' + ZipFileName + '" "' +'@zipit.lst'+ '"') else Writeln (F, Command + ' »' + ZipFileName +" " '+ Filename +" "'); Writeln (F, "cd \\ '); Writeln (F, 'CLS'); endelig CloseFile (F); end; enden, den andre er hjertet i komponent. Execute metoden (se Listing 3) vil sette i gang en egen prosess som skal kjøre batch-filen, som vil i sin tur kalle WinZip kommandolinje. Dette vil unngå enhver form for avhengighet av hastigheten på maskinen som kjører programmet. For å gjøre dette, bruker jeg to API-funksjoner-CreateProcess og WaitForSingleObject (sjekk Windows API hjelpefilen for mer informasjon om hvordan du bruker disse funksjonene). Oppføring 3. Utfør rutinen.
prosedyren TFVWinZip.Execute; Var ProcessInfo: TProcessInformation; StartupInfo: TStartupInfo; Lukket: boolean; Oldtime: TDateTime; begynne hvis Assigned (FOnExecute) så FOnExecute (Selv); try {Chech UseFileList er satt, eller hvis filnavn eller er en gyldig fil} hvis UseFileList deretter begynne hvis FileList.Count = 0 da begynne MessageDlg (, mtError, [mbok], 0 'Ingen fil for å komprimere!'); Gå; ende annet FileList.SaveToFile (listname); ende annet begynne hvis ikke FileExists (filnavn) da begynne MessageDlg (Program kunne ikke finne fil for å komprimere! ", mtError, [mbok], 0); Gå; slutt; slutt; {Hvis ZipFileName er blank bruk Filename som standardnavn} hvis ZipFileName = '' da begynne hvis Filename < > '' da ZipFileName: = ChangeFileExt (Filename, "zip. ') Else ZipFileName: =' Untitled.zip '; slutt; {Opprett batch fil} CreateCompressBat; {Forbered vindusinnstillinger for prosessen} FillChar (StartupInfo, sizeof (TStartupInfo), 0); med StartupInfo ikke begynne cb: = sizeof (TStartupInfo); dwFlags: = STARTF_USESHOWWINDOW; wShowWindow: = SW_MINIMIZE; slutt; {Utfør batch fil som skilles prosess} CreateProcess (PChar (BatchFile), null, null, null, False, NORMAL_PRIORITY_CLASS, null, null, StartupInfo, ProcessInfo); {Vent på at prosessen skal fullføre eller avbryte den etter 10 sekunder} stengt: = False; Oldtime: = nå; gjenta tilfelle WaitForSingleObject (ProcessInfo.hProcess, 100) av WAIT_OBJECT_0: Lukket: = True; WAIT_FAILED: RaiseLastWin32Error; slutt; Application.ProcessMessages; til (lukket) eller (nå > Oldtime + 10000); {Slett batch-fil} DeleteFile (BatchFile); hvis UseFileList deretter DeleteFile (listname); bortsett MessageDlg (Program ikke kunne komprimere filen! ", mtError, [mbok], 0); end, end, Etter utførelse av batch-filen, og følgelig WinZip, vil Execute metoden bli kvitt alle de internt opprettede filene for deg. Når metoden returnerer, alt du sitter igjen med Zip-filen du opprettet eller filene du extracted.FinallyUsing objektet kunne ikke vært enklere: Bare ring Execute metoden etter å lage objektet og satt noen av sine egenskaper med den aktuelle verdier (se eksempel søknad inkludert) .For å kjøre denne komponenten, bare ringe Execute metoden etter å ha fylt komponentens egenskaper med riktig values.The enkleste alternativet er å levere navnet på filen du ønsker å komprimere (Filename) og navnet på zip-fil for å lage (ZipFileName) . Merk: Hvis du ønsker å komprimere mer enn én fil i samme zip-fil, kan du bruke Filelist streng listen.
hjelpefilen som følger med kommandolinjen tillegget for WinZip vil gi deg flere ideer om hvordan vi kan forbedre denne komponenten, og hvordan du kan dra full nytte av WinZip i applications.A par advarsler ... Du vil må sørge for at de to filene som følger med WinZip Command line Add-on (WZZIP.EXE og WZUNZIP.EXE) er i din vei. Hvis de ikke er det, må du flytte dem til system directory.Another ting å huske er at disse filene er gratis bare for de som har kjøpt WinZip og oppgradert til versjon 7 eller nyere. Etter min mening, dette kan knapt betraktes som en ulempe i dag. WinZip er blitt industristandarden arkivverktøy for Windows-miljøet, og det er veldig vanskelig å finne noen som ikke bruker it.If du har spørsmål eller kommentarer, send dem til meg på [email protected] forbundet med denne artikkelen: vicaria.zip