09. januar 2004 - 10:02Der er
111 kommentarer og 1 løsning
Fortsættelse til windowsAPI(stadig nyubegynder)(komprimering)
Hej. Jeghar nu fået listet alle filerne på min computer, og har gemt dise i en txt fil. Da jeg jo har frygtelig mange filer på min computer filer denne txt fil jo altså en hel del. Derfor vil jeg gerne komprimere/pakke filen, så denne fylder mindre. Jeg har siddet og kigget lidt på Lempel-Ziv algoritmen, som MS bruger.
zlib is designed to be a free, general-purpose, legally unencumbered -- that is, not covered by any patents -- lossless data-compression library for use on virtually any computer hardware and operating system.
Arne, mht. det program du skrev igår. Når metoden FindNextFile() kaldes, indsætter den et "\..\" så der gås et niveau op. Hvorfor gør den det? Altså jeg starter med at kalde funktionen med c:\test\*.* og det blir dernæst lavet om til c:\test\\..\*.*
strncat (samletsti,path,strlen(path)-7);//fjern \..\*.* da FindNextFile() indsætter \..\
if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY) { strcat (samletsti,data.cFileName);//sæt mappenavn i ende strcat (samletsti,level);//sæt \ i ende strcat (samletsti,wildcard);//sæt *.* i ende scanDir(samletsti);//rekursivt kald } else {
strcat (samletsti,data.cFileName);//sæt filnavn i ende for(i=0;i<strlen(samletsti);i++); printf("%s",samletsti[i]);
/*Her skal sammenlignes med de filtyper der skal scannes*/ }
} } FindClose(h); }
int main(int argc, char* argv[]) { char startsti[1000]={0};//Skal være stort array. Da denne skal sættes til argv. int i; strcpy (startsti,"c:\\test\\*.*"); for(i=0;i<strlen(startsti);i++) printf("%c",startsti[i]); scanDir(startsti); return 0; }
Forskellen på "C:\\dir\\*" og "C:\\dir\\*.*" er så helt præcis hvad? At i "C:\\dir\\*.*" søger den på alle filnavne og alle endelser, og i "C:\\dir\\*" søger den kun på dir's ?
Jeg kan ikke lige gennemskue hvorfor dette ikke virker.... Måske du lige lynhurtigt kan se :D hehe
// Filscan_sys.cpp : Defines the entry point for the console application. // #define WIN32_LEAN_AND_MEAN #include "stdafx.h" #include <stdio.h> #include <windows.h>
WIN32_FIND_DATA data; HANDLE h = FindFirstFile(path,&data);
if(h!=INVALID_HANDLE_VALUE) {
while(FindNextFile(h,&data)) {
strncat (samletsti,path,strlen(path)-1);//kopier absolutte sti og fjern *
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (strcmp(data.cFileName,".") ==0 || strcmp(data.cFileName,"..") ==0) continue;
strcat (samletsti,data.cFileName);//sæt mappenavn i ende strcat (samletsti,level);//sæt \ i ende strcat (samletsti,wildcard);//sæt * i ende scanDir(samletsti);//rekursivt kald } else { strcat (samletsti,data.cFileName);//sæt filnavn i ende for(i=0;i<strlen(samletsti);i++); printf("%s",samletsti[i]); /*Her skal sammenlignes med de filtyper der skal scannes*/ }
} } FindClose(h); }
int main(int argc, char* argv[]) { char startsti[1000]={0};//Skal være stort array. Da denne skal sættes til argv. int i; strcpy (startsti,"c:\\test\\*"); for(i=0;i<strlen(startsti);i++) printf("%c",startsti[i]); scanDir(startsti); return 0; }
Jeg håber ikke jeg ulejliger dig for meget Arne, og du skal nok få dine point her. Men det her gzip, kan det komprimere data der ligger i hukommelsen og lægge det i en fil, eller er det meningen man først skal ligge data ned i en fx. txt fil, som derefter komprimeres? (Det første ville klart være mest optimalt hvis det kunne lade sig gøre).
Mmm det er måske lige langhåret nok for mig. Jeg skal meget groft sagt bare kunne importere nogle filer, og kalde compress, lægge i fil. Læse fil og kalde decompress så jeg har information. Er det muligt?
oki...kanon...Nu har jeg jo downloadet zlib, og der er 1000 filer....Er det muligt du lige kan skubbe mig igang med at bruge det :) Bare et kort eksempel?
Du vælger at bruge det nemme interface som i dette eksempel:
#include <stdio.h> #include <string.h>
#include "zlib.h"
int main() { int l1,l2,l3; char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; char s2[200]; char s3[200]; l1 = strlen(s1); compress(s2,&l2,s1,l1); uncompress(s3,&l3,s2,l2); s3[l3] = '\0'; printf("%s\n",s1); printf("%d -> %d -> %d\n",l1,l2,l3); printf("%s\n",s3); return 0; }
Du builder. Her er for MS VC++ (med ovenstående program som usezlib.c):
yepper :) Det er kanon. Lige hvad jeg skulle bruge Arne. Undskyld jeg ikke har svaret, men der gik lige druk i den i går aftes. Har du tid til lige at kigge på et stykke kode for mig...meget lille...kan simelthen ikke finde ud af hvad der er galt nemlig
Det er læsning af en ini-fil. inifilen hedder scanner.ini og ligger i roden af c: og indeholder følgende
[generel] <filetypes>mp3;avi;jpg;bmp;
Problemet er at intet bliver lagt op i mit fileextarray, hvor der burde ligge de 4 forskellige filtyper skrevet i inifilen...Jeg kan ikke gennemskue hvorfor...Måske du har mere held :)
int main(int argc, char* argv[]) { FILE *fp; bool important;//indikerer om opsætning er aktuel jf.[comp] i .ini fil fp=fopen("c:\\scanner.ini","r"); int c,i=0,readAction=0,fileExtCtr=0; char tempstreng[40]={0},startsti[MAX_arraystr]={0};//Skal være stort array. Da denne skal sættes til argv.; char* fileExt[500];
Jeps så virker det. Men jeg forstår altså ikke hvorfor det andet ikke virkede...Jeg ved godt jeg prøvede at lægge et chararray ind på en char pointers plads. Men er de i princippet ikke det samme? Og jeg lavede et andet testprm hvor det godt kunne lade sig gøre... Måske du kunne oplyse mig hæhæ :)
lækkert :) Det er mht. den komprimeringskode du skrev tidligere. Den vil ik ritti køre. Jeg har været inde i miljøvariabler og sætte path op til der hvor zlib ligger c:\zlib\include Men den kan ikke finde den
hmmmm jeg har sat det op i project>settings>link valgt input og skrevet "zlib\lib\zdll.lib" i additional library path og i Resources zlib\include i Addtional resource include directories. Filer ligger placeret i c:\zlib Samme har jeg tilføjet til PATH. Har prøvet at fjerne zlib så der bare står \include og har også prøvet at skrive absolutte sti....
project>settings>link valgt input og skrevet "zlib\lib\zdll.lib" i additional library path og i Resources zlib\include i Addtional resource include directories.
Compiling... main.c E:\rodeDir\appelhelp\sent\Exercise 03\main.c(5) : fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory Error executing cl.exe.
int main() { int l1,l2,l3; char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; char s2[200]; char s3[200]; l1 = strlen(s1); compress(s2,&l2,s1,l1); uncompress(s3,&l3,s2,l2); s3[l3] = '\0'; printf("%s\n",s1); printf("%d -> %d -> %d\n",l1,l2,l3); printf("%s\n",s3); return 0; }
Lige mine ord. Det gir absolut ingen mening. Jeg har sat min path op i miljøvariabler også. Selvom det jo er ligemeget når jeg skriver den absolutte sti.
Hej Arne. Jeg har fået det til at virke nu. så jeg kan godt compile når jeg inkluderer zlib.h Der er dog noget i koden der ikke virker helt logisk. har du tid et øjeblik?
unsigned char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; unsigned char s2[200]; unsigned char s3[200];
int main() { long l1,l2,l3; char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; char s2[200]; char s3[200]; l1 = strlen(s1); compress((unsigned char *)s2,(unsigned long *)&l2,(unsigned char *)s1,l1); uncompress((unsigned char *)s3,(unsigned long *)&l3,(unsigned char *)s2,l2); s3[l3] = '\0'; printf("%s\n",s1); printf("%d -> %d -> %d\n",l1,l2,l3); printf("%s\n",s3); return 0; }
Oki, nu kunne jeg compile og køre den :) Meget fornemt Hr. Arne. Jeg er imponeret.
Så 160 karakterer blir komprimeret til 77 ik sandt ? Det er jo bare kanon. Så hvis jeg ville gemme den komprimerede streng i en fil, skulle jeg efter compress gemme hvilken streng? Og hvad skulle jeg putte i uncompress()når jeg hentede den ud af filen igen.
int main() { FILE* fp; fp=fopen("comp.usr","w"); long l1,l2,l3,lFil; char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; char s2[200]; char s3[200]; char FraFil[200]; l1 = strlen(s1); compress((unsigned char *)s2,(unsigned long *)&l2,(unsigned char *)s1,l1);
Jeg ser man skal bruge længden l2 til at sende med når de skal dekomprimeres. Den kan jo bare godt være lidt svær at få fat i når det er 2 forskellige applikationer der skal compresse og decompresse. Er der en smart måde at omgå dette på andet end at gemme det i en fil ?
Arne..Håber du ikke har mistet al din tålmodighed med mig snart :) Skal siges at du har været en meget stor hjælp. Tusind tak. Jeg håbede jeg kunne få lov til at spørge om noget mere. Da min fil jo kan blive pænt stor, måske 10-20 mb alt afhængig af hvor meget der ligger på computeren er det jo ret meget at fylde op i hukommelsen hvis jeg skal lægge det hele ned i en datafil i en stor chunk. Jeg har siddet og eksperimenteret lidt og har fundet ud af at man ikke kan oprette et chararray der er større end 1 mb. Jeg ved godt det ikke er så smart at svine med hukommelsen på den måde, men jeg kan ikke se hvordan man kan løse mit problem anderledes nemlig. Mit problem er jo at der kan være ufattelig mange filer på en computer, og ikke så mange på en anden. Jeg ved desuden ikke hvad mapperne hedder på de forskellige computere, så det er svært at fastsætte en "recordsize" hvis jeg skulle skrive en "record" ad gangen. Så jeg er sådan lidt drønet ind i en blindgyde. Jeg tænkte om du evt. havde et forslag eller en lille tanke måske?
Hmm strange. Jeg har en funktion der komprimerer. Denne komprimering er baseret (i testøjemed) på et chararray på 200 pladeser. Komprimeringen duer fint nok hvis jeg kun kalder denne funktion. Kalder jeg en anden funktion tidligere i programmet der i øvrigt har intet med komprimeringsfunktionen at gøre virker komprimering slet ikke. Der bliver ikke komprimeret og 0 byte bliver skrevet i filen. Den prævise linie i den anden funktion der forudsager at komprimeringsfunktionen ikke duer er helt præcis char tempstreng[400]={0},startsti[MAX_arraystr]={0}; //MAX_arraystr=2000 Jeg synes simpelthen der er strange. Kan det have noget at gøre med at arraysne lapper ind over hinanden i hukommelsen/Stakken laver noget mystisk/jeg ikke rydder op i hukommelsen eller sådan noget....Jeg er lidt lost :) Så atter en gang må jeg spørge dig til råds Arne hehe, og andre selvfølgelig også der måtte have et svar :)
Hmmm ja...jeg kan jeg ikke sende dig koden pr. mail? Vil helst ikke fyre hele kildekoden af her på eksperten selvom den ikke er det helt vilde...Håber du forstår? Kan det lade sig gøre?
Lidt eksperimenteres viste at min kode vist burde have været:
#include <stdio.h> #include <string.h>
#include "zlib.h"
int main() { int l1,l2,l3; char s1[200] = "Dette er en lille test med en masse e'er som gerne skulle give en god compress:\n" "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; char s2[200]; char s3[200]; l1 = strlen(s1); l2 = sizeof(s2); l3 = sizeof(s3); compress(s2,&l2,s1,l1); uncompress(s3,&l3,s2,l2); s3[l3] = '\0'; printf("%s\n",s1); printf("%d -> %d -> %d\n",l1,l2,l3); printf("%s\n",s3); return 0; }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.