PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie komm ich aber an die Directory - Liste incl. dateinamen ran ?


Alfred
01.07.2002, 12:31
Hallöchen,

ich schreibe gerade ein Archivierungsprogramm das mir die Directory
z.B. einer cd auslesen soll.

wie komm ich aber an die Directory - Liste incl. dateinamen ran ?
ich hätte die gerne in ein feld damit ich damit noch weiter arbeiten kann.

ich benutze Visual c++ 6
win95 & win98 & winxp prof.

hat jemand eine idee ?


MFG *Alfred*


Felix Kaiser
01.07.2002, 13:16
Das Includefile dos.h führt diese Funktionen ein:
_dos_findfirst
_dos_findnext

Damit kannst du den Inhalt eines Verzeichnisses auflisten und durch eine Rekursion auch den aller Unterverzeichnisse. Versuchs mal damit.

xOOn
01.07.2002, 14:01
mit findfirstfile und findnextfile kannste das auch machen, damit habe ich das immer gebaut sind windows api's du fragst dann nur noch ab ob es "." oder ".." ist, weil die sucken und koennten auch mal gekillt werden! und das ganze musst du in ne rekursion schachteln, wenn noch fragen oder probs gibt kannste es ja nochmal posten wenn ich zeit habe bau ich dir ein sample

Alfred
01.07.2002, 15:41
ich wurschtel mal, ob ich das so hinbekomme.

ein sampel wäre allerdings nich schlecht.

Danke allerseitz.


MFG Alfred:)

DerWolf
01.07.2002, 16:04
Beispiel (vielleicht net schön aber funzt ;) )
void findfiles (char *f)
{
WIN32_FIND_DATA data;
HANDLE h;
char tmp[MAX_PATH], tmp1[MAX_PATH];

strcpy(tmp, f);
strcat(tmp, "*.*");

if ((h = FindFirstFile(tmp, &data)) && (h == INVALID_HANDLE_VALUE))
{
return;
}

do
{
if (!strcmp(data.cFileName, ".") || !strcmp(data.cFileName, ".."))
;
else
if (data.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(tmp1, f);
strcat(tmp1, data.cFileName);
strcat(tmp1, "\\");
/* Hier VerzeichnisName in Liste eintragen */
findfiles(tmp1);
}
else
{
strcpy(tmp1, data.cFileName);
strcat(tmp1, "\n");
/* Hier DateiName in Liste eintragen */
}

} while ((FindNextFile(h, &data)) && (h != INVALID_HANDLE_VALUE));

}Der Funktion übergibst du den Namen des Verzeichnisses indem gesucht werden soll. Die Funktion geht auch alle Unterordner durch! Beim Startverzeichnis muss ein Backslash am Ende stehen :) also "C:\\Windows\\" z.B.
Ich hoff es bringt dir was. Bye

PS: ISt ein sehr alter Code von mir, kann inzwischen bissel besser proggen ;)

Alfred
08.07.2002, 09:51
Hmm der code funtzt zwar aber nur wenn ich von diskette oder platte das inhaltzverzeichniss lade.
wenn ich von cd das verzeichniss will erkennt das prog die unterverzeichnisse nich mehr.
woran liegt das ??

hier mal der test code den ich gerade verwende :

------------------------------------------------------------------------------


# include <stdio.h>
# include <iostream.h>
# include <windows.h>
# include <conio.h>
# include <stdlib.h>


char drive[10000];
void findfiles(char *f);
void main()
{

printf("geben sie ein laufwerk ein :");

strcpy(drive,"");
scanf("%s",drive);

findfiles(drive);
printf("\n\n fertig");
while(!kbhit());
}





void findfiles (char *f)
{

WIN32_FIND_DATA data;
HANDLE h;

char tmp[_MAX_PATH],tmp1[_MAX_PATH];
char bla[10000];
FILE* stream;



strcpy(tmp,f);
strcat(tmp,"*.*");

if ((h=FindFirstFile(tmp,&data))&&(h==INVALID_HANDLE_VALUE))
{
return;
}


do
{
if (!strcmp(data.cFileName,".")||!strcmp(data.cFileName,".."));
else

if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(tmp1,f);
//strcmp(tmp1,f);
strcat(tmp1,data.cFileName);
strcat(tmp1,"\\");
// ab hier Verzeichnisname in array packen

printf("Verzeichniss : ----> %s\n",tmp1);


stream=fopen("c:\\datenträgerinhalt.txt","a");
fprintf(stream,"%s\n",tmp1);
fclose(stream);


findfiles(tmp1);

}

else
{
strcpy(tmp1,f);
strcpy(tmp1,data.cFileName);
strcat(tmp1,"\n");
// ab hier dateinamen in Array packen

printf("File : ----> %s%s",f,tmp1);

stream=fopen("c:\\datenträgerinhalt.txt","a");
fprintf(stream,"%s%s",f,tmp1);
fclose(stream);



findfiles(tmp1);

}

}
while((FindNextFile(h,&data))&&(h != INVALID_HANDLE_VALUE));



}

------------------------------------------------------------------------------

hat jemand eine Idee ?


MFG Alfred[list]

xOOn
08.07.2002, 13:27
also schreib das am besten so:

also der teil muesste funken!!:rolleyes: :rolleyes: :rolleyes:


# include <stdio.h>
# include <iostream.h>
# include <windows.h>
# include <conio.h>
# include <stdlib.h>


char drive[10000];
void findfiles(char *f);
void main()
{

printf("geben sie ein laufwerk ein :");

strcpy(drive,"");
scanf("%s",drive);

findfiles(drive);
printf("\n\n fertig");
while(!kbhit());
}


void findfiles (char *f)
{

WIN32_FIND_DATA data;
HANDLE h;

char tmp[_MAX_PATH],tmp1[_MAX_PATH];
char bla[10000];
FILE* stream;




strcpy(tmp,f);
strcat(tmp,"*.*");

if ((h=FindFirstFile(tmp,&data))==INVALID_HANDLE_VALUE)
{
return;
}

do
{
if (strcmp(data.cFileName,".") && strcmp(data.cFileName,".."))
{
if (data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(tmp1,f);
//strcmp(tmp1,f);
strcat(tmp1,data.cFileName);
strcat(tmp1,"\\");
// ab hier Verzeichnisname in array packen

printf("Verzeichniss : ----> %s\n",tmp1);


stream=fopen("c:\\datenträgerinhalt.txt","a");
fprintf(stream,"%s\n",tmp1);
fclose(stream);

// rekursion hier starten
findfiles(tmp1);
}
else
{
strcpy(tmp1,f);
strcpy(tmp1,data.cFileName);
strcat(tmp1,"\n");
// ab hier dateinamen in Array packen

printf("File : ----> %s%s",f,tmp1);

stream=fopen("c:\\datenträgerinhalt.txt","a");
fprintf(stream,"%s%s",f,tmp1);
fclose(stream);
}
}
}
while(FindNextFile(h,&data));

// handle wieder freigeben
FindClose (h);
}

xOOn
08.07.2002, 13:33
achja zum fehler:

also ich vermute dass:
// ab hier dateinamen in Array packen

printf("File : ----> %s%s",f,tmp1);

stream=fopen("c:\\datenträgerinhalt.txt","a");
fprintf(stream,"%s%s",f,tmp1);
fclose(stream);


findfiles(tmp1);

}

das prob ist, weil du bei dateien ein ziemliches prob kriegst du nimmst dateien wie verzeichnisse her, also du startest die rekursion auch bei dateien zB C:\Autoexec.bat\*.*, dadurch stimmt das handle nicht und es wird return ausgeloest!

naja das mit den cds musste jetzt testen aber ich wuesste nicht warum es rumzicken sollte

Alfred
09.07.2002, 08:11
Ok ich habs nochmal unter w98 getestet. kömischerweise funtzt es
da . warum weis der geier ???!!!???
jetz hab ich nen anderes problem. warum kriege ich tmp1 nich in ein array ?

wenn ich das so probiere

help[i][0]=tmp1[0];

kriege ich den inhalt nich mehr raus.
bzw.ich bekomme nur ein char.

mach ich da was mit den formaten falsch ??

MFG Alfred

thos
09.07.2002, 08:42
@Alfred

tmp1[0] steht für das erste zeichen des arrays (char).

wenn du tmp1 als GANZES (string) kopieren willst müsstest du es so machen:

char *help[10]; // z.B. ein array für 10 strings
help[0]= new char[strlen(tmp1)+1]; // +1 für die string-terminierung \0
if(help[0] !=0) // wenn new erfolgreich war
help[0]=tmp1;

damit steht dann in help[0] die adresse des neu kopierten strings.
das könnte man dann vielleicht so verwenden:

cout << help[0] << endl;

nicht vergessen den zeiger in help[0] auch irgendwann wieder freizugeben!

delete[] help[0];

alle klarheiten beseitigt? :-)

thanX for ya attention

Alfred
09.07.2002, 09:33
@thos


alle klarheiten beseitigt? :-)


entgültig *g*

ich glaub da muss ich jetzt erstmal mal nen nacht drüber coden. :)


MFG Alfred

Baegsch
09.07.2002, 12:49
btw. schaut mal was passiert wenn ihr nen findfile() nen string übergebt, der die Länge MAX_PATH + sizeof(HANDLE) + sizeof(WIN32_FIND_DATA) + 8 hat ;) :D

Alfred
10.07.2002, 14:07
ok die adresse ,ok.

aber ich möchte nich die adresse sondern den string in ein 2dfeld
kopieren damit ich zb in einer schleife das ganze 2dfeld zu speichern, sortieren, etc..

ich hab versucht durch die adresse irgendwie an den string zu kommen nur funtz das nich.

array[i][0]= new char[strlen(tmp1)+1]; // +1 für die string-terminierung \0
if(array[i][260] !=0) // wenn new erfolgreich war
array[i++][0]=tmp1;


wobei in array[i][0] ein string stehen soll und keine pointeradresse,
steht da irgendwo ne struktur rum in der die strings stehen?

hilfe !! :mauer:

MFG Alfred

thos
10.07.2002, 17:28
@Alfred

ich dachte du willst das ganze gleich richtig mit dynamischer speicherverwaltung ...
aber du kannst es natürlich auch statisch machen, einfach über ein 2D-array. bitte sehr:

char cArray[10][256]; // ein Array für 10 strings zu je 255 zeichen (=max. länge für dateinamen)
char temp[256]; // ein Array für einen string

..
.. // in temp[] kommt jetzt irgendwann ein string rein, wie auch immer ...
...

strcpy(cArray[0], temp); //damit kopierst du den temp-string in den 2D-Array --> des Rätsels Lösung !?!? he he he

das wars auch schon.

benutzen läßt es sich wieder genauso wie mit zeigern ... z.B.:

cout << cArray[0] << endl;

verständlicher? ich glaube du willst es so ...oder?

Alfred
11.07.2002, 08:34
@thos

das ich strcpy() strings kopieren kann iss mir schon klar, aber in diesem fall funtz das nich warum auch immer...

in tmp steht nämlich kein string drin sondern nur ein pointer auf den string...

deshalb kriege ich den string auch nich mit strcpy() raus.
ich bekomme also von findfile,findfirstfile pointer zurück und keine strings.




MFg Alfred

xOOn
11.07.2002, 08:58
also...

1. in c++ ist ein string ein pointer auf einen char, und das char-zeichen 0 gibt dabei das stringende an!
2. ...in tmp steht nämlich kein string drin sondern nur ein pointer auf den string... also so wie es thos geschrieben hat (strcpy(cArray[0], temp); ) ist es ok, du schreibst nicht auf den pointer vom string (pointer auf pointer von char) weil der [0] angibt!
3. ich bekomme also von findfile,findfirstfile pointer zurück und keine strings. DEFINITIV NEIN du kriegst strings (zb pointer auf char wobei char == 1 zeichen


also wenn es darum geht nun alle files in ein feld einzutragen dann hat man das prob dass man die benoetigte groesse im vornhinen nicht weis. also std::vector (standard template library) ist doch wie geschaffen dafuer. wenn wer ein sample braucht posten

Alfred
11.07.2002, 09:40
@thos

soorry... irgendwie steh ich wohl aufm schlauch.
nichtz für ungut.

@XOOn
poooossssttttt *g*

ich kapier jetz rein gar nichts mehr *lol*.

wäre wircklich klasse wenn du ein sample hättest das mir das verständnis für die sache ein wenig erleichtert.

das ein string ein pointer auf eine reihe von chars ist is mir klar,
nur der bezug auf diesen speziellen fall bei meinem prog ist
mir echt schleierhaft.

wie zum henker kriege ich aus tmp das mit findfile gefüttert
wird, ein string, mit dem ich in meinem 2dfeld etwas anfangen kann ??

kennst du evtl. ein gutes tut zum thema files filefind ?

oder ein weiterführendes tut oder buch zum thema pointer
in dem etwas mehr drinsteht wie in den büchern zum c/c++ lernen ??
(die MFC is in diesem fall auch keine richtige hilfe...)

oder bin einfach nur zu doof ? :mauer:


MFG Alfred

xOOn
11.07.2002, 09:52
also ich kanns erst heute abend ansehen ausser du schickst mir das teil an xOOn@myrealbox.com:D :D :D oder du kannst es auch im board speichern (dateien anhaengen):) :) :)

also du willst alle datein durchsuchen und das in einem array saven oder?

Alfred
11.07.2002, 10:02
jawohl.

ich schick dir das Teil Mal.



MFG verzweifelter Alfred :D

thos
11.07.2002, 10:31
@Alfred

ok, nochmal, ...ist kein problem für mich es nochmal zu erklären solange du dich
ernsthaft bemühst es zu verstehen! :-)

temp ist ein "string".
ein "string" ist aber in wirklichkeit bloß ein zeiger auf ein char-array.

wenn du also einen char-array erzeugst, z.B. so:

char temp[256];

...steht der name "temp" bloß für einen zeiger auf das erste char-element des arrays.


wenn du nun einen 2D char-array erzeugst, z.B. so:

char cArray[10][256];


dann steht "cArray[0]" für den ersten zeiger auf die ersten freien 256 elemente!
(ist also damit auch ein string!)

und "cArray[1]" steht für den zweiten zeiger auf die zweiten freien 256 elemente!
(ist also damit auch ein string!)

etc.etc..

kurze zusammenfassung:
"temp" ist ein string.
"cArray[0]" ist ein string. (oder cArray[1], oder cArray[xyz] ..)

genauso gilt:
"temp" ist ein zeiger auf das erste element eines arrays von char.
"cArray[0]" ist ein zeiger auf das erste element eines arrays von char.

also kannst du beide gleichwertig behandeln:

cout << cArray[0] << endl;
cout << temp << endl;

oder ...

strcpy(temp, "Max Mustermann");
strcpy(cArray[0], "Max Mustermann");

oder eben auch:

strcpy(cArray[0], temp); // da ja beide für ein string stehen!

wenn du nun einen 2D array erzeugen willst zur speicherung der directory dann mach das so:

char cArray[1000][256];

in diesen array könntest du 1000 einträge zu je 255 zeichen speichern.

und dann:

strcpy(cArray[0], temp);
.
..
.
strcpy(cArray[1],temp);
.
..
.
strcpy(cArray[2], temp);
.
..
.
etc.etc.

bloß ....was ist wenn es mehr als 1000 einträge werden?
wenn du sicher weißt das es nicht mehr werden ist es O.K.
doch wenn du dir nicht sicher bist müsstest du entweder einen
noch größeren array erstellen, oder eben den speicher "DYNAMISCH" anfordern !

das geht entweder mit dem schlüsselwort "new" bzw. auch mit std::vector aus der STL.
doch dynamische speicherverwaltung ist ein thema für sich.
da würde ich dir raten nochmal was darüber zu lesen!

und noch was:
was ist wenn du dann nur 10 einträge drinnen speicherst?
dann bleiben 990 einträge unbenutzt, belegen aber eine masse speicher!
das ist eigentlich sehr schlechter programmierstil!

doch wenn dich das nicht stört .... ;-)

Alfred
11.07.2002, 10:49
@thos

ok das iss mir klar ,ich kanns auch in jedem anderen fall anwenden.

nur komme ich eben nich mit dem filefind klar..

bzw mit dem was file find zurückliefert.

ich dachte auch ich könnte einfach tmp in mein 2dfeld reinkopieren,
nur leider kommt dann nur müll raus.

oder muss ich etwa char für char den string rauskopieren?

mfg alfred

xOOn
11.07.2002, 11:08
1. ich habe es versucht zum laufen zu bringen, und habe dashalb die ganzen komischen pointer rausgeschmissen, weil man es ja nicht komplizerter machen muss als es ist
2. ein prob mit den cd-roms ist ein prob mit dem dir erkennen
data.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY ist falsch weil wenn eine dir schreibeschuetzt ist (zB bei cdroms) dann dat die nicht diese zahl du musst es maskieren data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
3. nur ein tipp beim fertigen prog lass die anzeige weg dann ist dein prog x mal schneller:D
4. ich speichere die files und die dirs in getrennten arrays aber das kannste einfach aendern, gespeichert werden nur die datei, das kann man aber easy aendern
5. zum testen hab ich die meisten outpus mal wegkommentiert mit /* @@@ */ die @@@ kannste wieder reinmachen den rest wuerde ich draussen lassen
6.
strcpy(tmp1,f);
strcpy(tmp1,data.cFileName);
also das wird so sein sollen:
strcpy(tmp1,f);
strcat(tmp1,data.cFileName);


wenns noch frage gibt, dann frage

und::eek: :eek:

Infos zu diesem Programm :
---------------------------------------
Dieses Programm darf nicht ohne meine
Zustimmung verändert oder erweitert werden.
Alle Test oder Betaversionen sind Freeware
und dürfen ohne Einschränkung verbreitet werden.

ich habe mich mal darueber hinweggesetzt:D :D

Alfred
11.07.2002, 11:15
@XOOn

schönes "lies mich gell ??" :D

das muss wenigstens nich compiliert werden *lol* :D :D :D :D


Danke das müste mir reichen.

wer interresse am fertigen prog hat soll posten.


MFG Alfred

xOOn
11.07.2002, 11:18
jepp lass es mal sehen wenn es fertig iss

[QUOTE]
bloß ....was ist wenn es mehr als 1000 einträge werden?
wenn du sicher weißt das es nicht mehr werden ist es O.K.
doch wenn du dir nicht sicher bist müsstest du entweder einen
noch größeren array erstellen, oder eben den speicher "DYNAMISCH" anfordern !

das geht entweder mit dem schlüsselwort "new" bzw. auch mit std::vector aus der STL.
doch dynamische speicherverwaltung ist ein thema für sich.
da würde ich dir raten nochmal was darüber zu lesen!

und noch was:
was ist wenn du dann nur 10 einträge drinnen speicherst?
dann bleiben 990 einträge unbenutzt, belegen aber eine masse speicher!
das ist eigentlich sehr schlechter programmierstil!

doch wenn dich das nicht stört .... ;-)
QUOTE]

1. Murphys gesetz sagt: du wird nie 900 eintraege haben aber immer 1001
2. dynamisch anlegen suckt weil wie willst du das machen nei jedem eintrag den ganzen array kopieren oder verkettete listen coden das beste ist std
3. schlechter programmierstil ist besser als ein proggi das nicht funkt:p :p ** auf 100te beschwerde-posts einstellen **

Alfred
12.07.2002, 14:14
Hab das Aktuelle Prog online gestellt.
Kritick und anregungen bitte in das gästebuch.



MFG Alfred