|
| 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>
>
>
| |
|
|