[c++] chdir commando

Pagina: 1
Acties:

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Ik heb een klasse gemaakt om bestanden en submappen door te zoeken in een vooraf aangegeven map. Nu wil ik recursief door de mappen zoeken, dus mappen in mappen en daarin weer mappen. Daarvoor gebruik ik het commando chdir, maar Visual C++ geeft aan dat het deze functie niet kent. Borland C++ Builder kent het wel. Hoe werkt dit in VC++?

Fat Pizza's pizza, they are big and they are cheezy


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
_chdir

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

De correcte vertaling van 'chdir' is 'SetCurrentDirectory', maar die hoor je helemaal niet te gebruiken voor recursief loopen. Druk eens op F1 en zoek naar 'FindFirstFile'

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
Waarom zou je SetCurrentDirectory niet mogen gebruiken? Ik kan me voorstellen dat het niet nodig is, maar is er een reden waarom het slecht zou zijn? Ik ga er daarbij natuurlijk vanuit dat je aan het eind van de recursie weer terugkeert naar de directory waarin je begon.

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Topicstarter
Om alles wat duidelijker te maken, zo ziet de functie er uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void MP3::findInDir(string dir, ofstream &out)
{
    struct _finddata_t bestand;
    long hFile;
    chdir((const_cast<char*>(dir.c_str())));

    if((hFile = _findfirst( const_cast<char*>((dir+"*.*").c_str()), &bestand )) == 0L )
    {
        cout << dir << endl;
        cerr << "Er zijn geen bestanden gevonden";
        exit(1);
    }
    else
    {
        while(_findnext(hFile, &bestand) == 0)
        {
            if(!(strcmp(bestand.name,".") && strcmp(bestand.name,"..")))
            {
                //niets
            }
            else
            {
                if(bestand.attrib & _A_SUBDIR)
                {
                    cout << "subdir: " << bestand.name << endl;
                    findInDir(strcat(dir,bestand.name), ofstream &out)
                }
                else
                {
                    if(vergelijkExt(bestand.name,"mp3"))
                    {
                        cout << bestand.name << endl;
                    }
                }
            }
        }
    }
}


Het komt er dus op neer dat elke keer als er een nieuwe map gevonden wordt, deze ook gescant word.
Het probleem is echter deze melding tijdens het compilen:
D:\CPP\week3opdr12\week3opdr12.cpp(178) : error C2065: 'chdir' : undeclared identifier

overigens geeft '_chdir' dezelfde foutmelding.

[ Voor 12% gewijzigd door JKVA op 11-01-2004 19:19 ]

Fat Pizza's pizza, they are big and they are cheezy


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:03
Altijd even de handleiding erbij pakken he:
Run-Time Library Reference: _chdir, _wchdir
Heb je de juiste headers en libraries gebruikt?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op 11 januari 2004 @ 17:22:
Waarom zou je SetCurrentDirectory niet mogen gebruiken? Ik kan me voorstellen dat het niet nodig is, maar is er een reden waarom het slecht zou zijn? Ik ga er daarbij natuurlijk vanuit dat je aan het eind van de recursie weer terugkeert naar de directory waarin je begon.
de huidige dir is wordt bijgehouden per proces, niet per thread. Als je code hier dus van afhankelijk is betekent het dat het dus niet thread-safe is. Goed, misschien is dat in het geval van de topicstarter niet erg, maar het is dus goede praktijk om het zoveel mogelijk proberen te vermijden (en in feite zou je SetCurrentDirectory () dus eigenlijk nooit hoeven te gebruiken)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1