/ 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
Get current directory
Fra : Bertel Lund Hansen


Dato : 02-08-01 08:35

Hej alle

Hvordan får jeg fat i arbejdsmappen i C?

Jeg har fundet <unistd.h> og funktionen getcwd() som også ser ud til at virke,
men alligevel ikke.

Egentligt problem:
Jeg er ved at lave recurse.exe der tager en DOS-kommando som input og
aktiverer denne i den aktulle mappe samt alle undermapper.
Det virker fint hvis jeg nøjes med f.eks. "dir", men hvis jeg kalder et
eksternt program (in casu gsar.exe), så går der kuk i det. Jeg har haft et
Pascalprogram der virkede helt uden problemer.
Faktisk så prøver gsar at bearbejde filnavne (som det så ikke kan finde) fra
startmappen selv om jeg inde i løkken bruger chdir() til at skifte til diverse
undermapper.

Programmet må naturligvis gerne være portabelt, men det er ikke vigtigt. Det
væsentlige er at det virker på et Windowssystem, og faktisk regner jeg ikke
med at det vil interessere andre.

Hele koden:
==========
// Gennemløb en mappestruktur og afvikl en DOS-kommando i hver mappe.

#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <unistd.h>
#include <string.h>

#include <conio.h>


enum { DIR=16, FILEMASK=0x3F, NAMELENGTH = 300 };


char Kommando[NAMELENGTH], Start_dir[NAMELENGTH], Pause;


int recurse_dir (char *path) {
struct ffblk *fblockp;
char searchname[NAMELENGTH], dirname[NAMELENGTH];
char kode;

fblockp=malloc (sizeof(struct ffblk));
sprintf(searchname,"%s\\*.*",path);
kode=findfirst(searchname,fblockp,FILEMASK);
while (!kode) {
if ( (fblockp->ff_name[0]!='.') && (fblockp->ff_attrib & DIR) ){
sprintf(dirname,"%s\\%s",path,fblockp->ff_name);

chdir(dirname);
system(Kommando);
if (Pause) {
printf("Tryk en tast\r");
if (getch()==27) { chdir(Start_dir); exit(1); }
clreol();
}
recurse_dir(dirname);
}
kode=findnext(fblockp);
}
return 0;
}



int main (int argc, char *argv[]) {
char *pos;
int nr;

if (argc<2) { // Udtræk programmets navn og vis hjælpeteksten.
strcpy(Kommando,argv[0]); *strchr(Kommando,'.')=0;
pos=strchr(Kommando,0);
while ((*pos)!='/') --pos;
printf("\n Syntax: %s DOS-kommando \n\n",pos+1);
printf(" Dette program genneml›ber en biblioteksstruktur\n");
printf(" og afvikler den anf›rte DOS-kommando i hvert bibliotek.\n\n");
exit(0);
}

Pause=0; nr=1; // Check om der ønskes pause
if ( (argv[1][0]=='-') && (argv[1][1]=='p') ) {
Pause=1; nr=2;
}
sprintf(Kommando,argv[nr]); // Saml DOS-kommandoens 'stumper' i én streng.
for (nr+=1; nr<argc; ++nr) sprintf(Kommando,"%s %s",Kommando,argv[nr]);

getcwd(Start_dir,NAMELENGTH);
recurse_dir(Start_dir);
chdir(Start_dir);

return 0;
}



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

 
 
Benny Andersen (02-08-2001)
Kommentar
Fra : Benny Andersen


Dato : 02-08-01 12:31

On Thu, 02 Aug 2001 09:34:50 +0200, Bertel Lund Hansen
<skrivtil@lundhansen.dk> wrote:

Klip

>int recurse_dir (char *path) {
> struct ffblk *fblockp;
> char searchname[NAMELENGTH], dirname[NAMELENGTH];
> char kode;
>
> fblockp=malloc (sizeof(struct ffblk));
> sprintf(searchname,"%s\\*.*",path);
> kode=findfirst(searchname,fblockp,FILEMASK);
> while (!kode) {
> if ( (fblockp->ff_name[0]!='.') && (fblockp->ff_attrib & DIR) ){
> sprintf(dirname,"%s\\%s",path,fblockp->ff_name);
>
> chdir(dirname);
> system(Kommando);
Skal 'system(Kommando)' ikke flyttes op over while løkkens start, så
reurse_dir altid udfører 'kommando', samt for hver subdir, skifter til
det og kalder sig selv.

> if (Pause) {
> printf("Tryk en tast\r");
> if (getch()==27) { chdir(Start_dir); exit(1); }
> clreol();
> }
> recurse_dir(dirname);
> }
> kode=findnext(fblockp);
> }
> return 0;
>}
Klip

Bertel Lund Hansen (02-08-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 02-08-01 16:21

Benny Andersen skrev:

>Skal 'system(Kommando)' ikke flyttes op over while løkkens start

Sikkert. Den slags kikker jeg på når det virker.

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

Søren B. Thygesen (03-08-2001)
Kommentar
Fra : Søren B. Thygesen


Dato : 03-08-01 15:40

Jeg tror ikke <conio.h> er standard C så portabilliteten er sådan set
allerede gået fløjten :) Standard C siger heller ikke noget om
biblioteker så der er ikke meget hjælp at hente. Men hvis du er på en
windoze platform kan du jo:

[ccode]
#include <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {

   TCHAR   szCurDir[MAX_PATH];

   if(GetCurrentDirectory(MAX_PATH, szCurDir) == 0) {
      fprintf(stderr, "Could not determine current working directory.\n");
      return 1;
   }

   printf("Current directory: %s\n", szCurDir);

   return 0;
}
[/ccode]

mvh,
S. Bro

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste