/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
program til søgning af filer i undermapper
Fra : news.tiscali.dk


Dato : 17-03-03 10:12

Hej

Jeg har en ca. 2500 tekstfiler i en mappestruktur der er max 3 dyb. Alle
disse filer ville jeg gerne kunne søge (der ligger ca. 10000 ialt) og gemme
navne/mapper på dem så jeg kan trække data ud af dem alle til en database.

Jeg kan godt finde ud af det i en dybde, men 2 og 3 så begynder jeg at få
problemer :)

i nødstilfælde må jeg bruge en "dir *.dat /s > dir.txt" dos kommando og så
dekode tekstfilen, men det er en lidt upraktisk løsning, men mulig.

Jeg er mest interesseret i en .C / dos funktion, men en windows ville også
være ok, selvom det vil betyde at jeg skal bruge en anden maskine til at
skanne med. (data ligger på en os/2). Evt. et link til et sted med sådanne
nyttige programstumper / funktioner vil være ok, da jeg ikke har kunne finde
en side med det som samtidigt har virket.

mvh. Benny



 
 
Bertel Lund Hansen (17-03-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 17-03-03 10:49

news.tiscali.dk skrev:

>Jeg har en ca. 2500 tekstfiler i en mappestruktur der er max 3 dyb. Alle
>disse filer ville jeg gerne kunne søge (der ligger ca. 10000 ialt) og gemme
>navne/mapper på dem så jeg kan trække data ud af dem alle til en database.

>Jeg kan godt finde ud af det i en dybde, men 2 og 3 så begynder jeg at få
>problemer :)

Hvis du laver en rekursiv funktion, behøver du slet ikke
spekulere over hvilken dybde du er i. Her er lidt pseudokode:

void searchdir (string path) {
   find_filnavn();
   if (filnavn er et DIR
   og ikke starter med et eller to punktummer)
      searchdir(path+"/"+filnavn);
   else
      gør det som nu skal gøres;
}


int main () {
   searchdir ("C:/Tekstfiler");
}

>i nødstilfælde må jeg bruge en "dir *.dat /s > dir.txt" dos kommando og så
>dekode tekstfilen, men det er en lidt upraktisk løsning, men mulig.

Kender du dir /b /s? (Jeg er lidt i tvivl om hvad du skal bruge).

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Soren Davidsen (17-03-2003)
Kommentar
Fra : Soren Davidsen


Dato : 17-03-03 11:02

"news.tiscali.dk" <benny@tllh.dk> writes:

> Hej
>
> Jeg har en ca. 2500 tekstfiler i en mappestruktur der er max 3 dyb. Alle
> disse filer ville jeg gerne kunne søge (der ligger ca. 10000 ialt) og gemme
> navne/mapper på dem så jeg kan trække data ud af dem alle til en database.
>
> Jeg kan godt finde ud af det i en dybde, men 2 og 3 så begynder jeg at få
> problemer :)
>
> i nødstilfælde må jeg bruge en "dir *.dat /s > dir.txt" dos kommando og så
> dekode tekstfilen, men det er en lidt upraktisk løsning, men mulig.
>
> Jeg er mest interesseret i en .C / dos funktion, men en windows ville også
> være ok, selvom det vil betyde at jeg skal bruge en anden maskine til at
> skanne med. (data ligger på en os/2). Evt. et link til et sted med sådanne
> nyttige programstumper / funktioner vil være ok, da jeg ikke har kunne finde
> en side med det som samtidigt har virket.

Hej, tjek denne snippet ud, du kan modificere printdirhandler til at goere
hvad du vil med dine filer/kataloger:

http://turtle.math.klte.hu/search.c


Mvh,

--
___
Soren Davidsen / o\
Math student, ICSMA (_____)
__ http://www.tanesha.net/ _________________________________(___)_______

Klaus Petersen (23-03-2003)
Kommentar
Fra : Klaus Petersen


Dato : 23-03-03 15:55

> Jeg er mest interesseret i en .C / dos funktion, men en windows ville også
> være ok

Okay i så fald kan du kigge på denne her funktion, som jeg har taget ud af
en class. Koden er i øvrigt testet.

GetAllFiles sørger alle harddiske - GetFiles søger et bibliotek og dets
underbiblioteker igennem.

<kode>


bool TreeFileList::GetFiles ( unsigned int index, char *searchpath )
{
WIN32_FIND_DATA fd;
HANDLE sh;
char _searchpath [256];
char tmp [256];
FileRecord *fr;
PathRecord *pr;

pr = (PathRecord*) malloc ( sizeof (PathRecord) );
pr->index = index;
pathlist->add ( pr );

// construct searchpath

strcpy ( (char*)&_searchpath, searchpath );

if (_searchpath [ strlen ( (char*)&_searchpath)-1 ] != 0x5c)
strcat ( (char*)&_searchpath, "\\" );

// gem path

pr->pathnamelen = strlen ( (char*)_searchpath ) + 1;
pr->path = (char*) malloc ( pr->pathnamelen );
memcpy ( pr->path, &_searchpath, pr->pathnamelen );

//

strcat ( (char*)&_searchpath, "*.*" );

sh = FindFirstFile ( _searchpath, &fd );

if (sh == INVALID_HANDLE_VALUE)
return false;

do
{
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ( ( strcmp (".", fd.cFileName) != 0 ) && ( strcmp ("..", fd.cFileName)
!= 0 ) )
{
strcpy ( (char*)&tmp, searchpath );
strcat ( (char*)&tmp, fd.cFileName );

if (tmp [ strlen ( (char*)&tmp)-1 ] != 0x5c)
strcat ( (char*)&tmp, "\\" );

GetFiles ( index+1, (char*)&tmp );
};
}
else
{
fr = (FileRecord*) malloc ( sizeof (FileRecord) );

fr->filenamelen = strlen ( fd.cFileName ) + 1;
fr->filename = (char*) malloc ( fr->filenamelen );
memcpy ( fr->filename, fd.cFileName, fr->filenamelen );

fr->path = pr;

list->add ( fr );
};

} while (FindNextFile (sh, &fd));

FindClose (sh);

return true;
};

void TreeFileList::GetAllFiles ()
{
char buf [256];
int buflen;
int i;
UINT dt;

this->list = new MyList ();
this->pathlist = new MyList ();

buflen = GetLogicalDriveStrings ( 256, (char*)&buf );

i = 0;
while ( i < buflen )
{
dt = GetDriveType ( (char*)&buf [i] );

if ( dt == DRIVE_FIXED )
{
// printf ( "Searching drive %c:\n", buf [i] );
GetFiles ( 1, (char*)&buf [i] );
}

while ( (buf [i] != 0) && (i<buflen) )
i++;

i++;
};

};



</kode>



Benny (25-03-2003)
Kommentar
Fra : Benny


Dato : 25-03-03 09:34

Jeg takker for hjælpen, jeg er dog i mellemtiden blevet opmærksom på at jeg
nok burde starte med at lære lidt mere om c/c++, så jeg vil nok lige skaffe
mig accelerated c++ (tip fra tidl. indlæg) og læse den inden jeg prøver
forslagne. (de er gemt)


mvh. Benny

"Klaus Petersen" <ng@spectual.ra.bnaa.dk> skrev i en meddelelse
news:b5khs7$kme$1@sunsite.dk...
> > Jeg er mest interesseret i en .C / dos funktion, men en windows ville
også
> > være ok
>
> Okay i så fald kan du kigge på denne her funktion, som jeg har taget ud af
> en class. Koden er i øvrigt testet.
>
> GetAllFiles sørger alle harddiske - GetFiles søger et bibliotek og dets
> underbiblioteker igennem.
>
> <kode>
>
>
> bool TreeFileList::GetFiles ( unsigned int index, char *searchpath )
> {
> WIN32_FIND_DATA fd;
> HANDLE sh;
> char _searchpath [256];
> char tmp [256];
> FileRecord *fr;
> PathRecord *pr;
>
> pr = (PathRecord*) malloc ( sizeof (PathRecord) );
> pr->index = index;
> pathlist->add ( pr );
>
> // construct searchpath
>
> strcpy ( (char*)&_searchpath, searchpath );
>
> if (_searchpath [ strlen ( (char*)&_searchpath)-1 ] != 0x5c)
> strcat ( (char*)&_searchpath, "\\" );
>
> // gem path
>
> pr->pathnamelen = strlen ( (char*)_searchpath ) + 1;
> pr->path = (char*) malloc ( pr->pathnamelen );
> memcpy ( pr->path, &_searchpath, pr->pathnamelen );
>
> //
>
> strcat ( (char*)&_searchpath, "*.*" );
>
> sh = FindFirstFile ( _searchpath, &fd );
>
> if (sh == INVALID_HANDLE_VALUE)
> return false;
>
> do
> {
> if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
> {
> if ( ( strcmp (".", fd.cFileName) != 0 ) && ( strcmp ("..",
fd.cFileName)
> != 0 ) )
> {
> strcpy ( (char*)&tmp, searchpath );
> strcat ( (char*)&tmp, fd.cFileName );
>
> if (tmp [ strlen ( (char*)&tmp)-1 ] != 0x5c)
> strcat ( (char*)&tmp, "\\" );
>
> GetFiles ( index+1, (char*)&tmp );
> };
> }
> else
> {
> fr = (FileRecord*) malloc ( sizeof (FileRecord) );
>
> fr->filenamelen = strlen ( fd.cFileName ) + 1;
> fr->filename = (char*) malloc ( fr->filenamelen );
> memcpy ( fr->filename, fd.cFileName, fr->filenamelen );
>
> fr->path = pr;
>
> list->add ( fr );
> };
>
> } while (FindNextFile (sh, &fd));
>
> FindClose (sh);
>
> return true;
> };
>
> void TreeFileList::GetAllFiles ()
> {
> char buf [256];
> int buflen;
> int i;
> UINT dt;
>
> this->list = new MyList ();
> this->pathlist = new MyList ();
>
> buflen = GetLogicalDriveStrings ( 256, (char*)&buf );
>
> i = 0;
> while ( i < buflen )
> {
> dt = GetDriveType ( (char*)&buf [i] );
>
> if ( dt == DRIVE_FIXED )
> {
> // printf ( "Searching drive %c:\n", buf [i] );
> GetFiles ( 1, (char*)&buf [i] );
> }
>
> while ( (buf [i] != 0) && (i<buflen) )
> i++;
>
> i++;
> };
>
> };
>
>
>
> </kode>
>
>



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408193
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste