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/