sweep

harja 21.07.04 09:51

Ajaa tietyn komennon kaikissa hakemistoissa

 Tekstiversio  Arvo: 4 (6 ääntä)  Äänestä: +  -
/* Muokkaukset:
    + lisätty kommentointia
    - poistettu komentojen outputin redirectaus, määritä se itse komentojonon perään jos et
      halua kaiutusta
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <dir.h>
#include <sys/stat.h>

/* Hassu pyörivä propelli */
void roll(void)
{
  const char *prop = {"|/-\\"};
  static int prop_pos=0;

  if(prop_pos==3) prop_pos=0;
  printf("\b%c", prop[prop_pos++]);
}

/* Käy läpi rekursiivisesti koko hakemistopuun */
int sweepdir(char *dirname, char *command)
{
  DIR *dir;
  struct dirent *ent;
  struct stat sta;
  char newdirname[255]={0}, filename[255]={0};

  /* Avataan hakemisto */
  if((dir=opendir(dirname))==NULL)
  {
    fprintf(stderr, "Cannot open directory \"%s\"\n", dirname);
    return(0);
  }

  /* Luetaan hakemiston "entryjä" läpi, ja etsitään mahdolliset alihakemistot */
  while((ent=readdir(dir))!=NULL)
  {
    sprintf(filename, "%s%s", dirname, ent->d_name);
    /* Otetaan entryn tiedot */
    stat(filename, &sta);

    /* Onko hakemisto? Jos on, unohda "." ja ".."-hakemistot laskuista */
    if((sta.st_mode&S_IFDIR)&&strcmp(ent->d_name, ".")&&strcmp(ent->d_name, ".."))
    {
      /* Katenoidaan hakemiston nimi vanhan perään */
      sprintf(newdirname, "%s%s\\", dirname, ent->d_name);
      chdir(newdirname);
      /* Ajetaan komento */
      system(command);
      chdir("..");
      /* Kutsutaan rekursiivisesti tätä funktiota löytyneelle uudelle hakemistolle */
      sweepdir(newdirname, command);
    }
  }
  /* Pyöritellään propellia */
  roll();
  return(1);
}

int main(int argc, char *argv[])
{
  int i=0;
  char command[255]={0}, temp[10]={0};
  if(argc<2)
  {
    fprintf(stderr, "\tUSAGE: sweep.exe <command-to-execute> arg1...argN of the program\n");
    return(1);
  }

  /* Luodaan komento katenoimalla siihen kaikki saadut parametrit  */
  for(i=1;i<argc;i++)
  {
    sprintf(temp,"%s ", argv[i]);
    strcat(command, temp);
  }

  printf("This might take a while, so don't reboot or do any quick moves ;-)\n");
  printf("Processing... ");
  if(!sweepdir(".\\", command))
    fprintf(stderr, "Something went wrong.. sorry.\n");
  else
   printf("All ok.\n");
  printf("Have a nice day.\n");
  return(0);
}

 

renni 11:22 21.7.04 
Koodissa saa olla kommenttejakin, vaikka koodi olisi yksinkertaistakin.
Kovakoodattu temppihakemiston sijainti on aika paha kauneusvirhe.

harja 15:10 21.7.04 
Korjaisin, mutta muokkaustoiminnossa on bugi :-P
neon 13:45 22.7.04 
mikefast kirjoitti:
Korjaisin, mutta muokkaustoiminnossa on bugi :-P


Muokkaustoiminnon bugi pitäisi olla korjattu.