Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод файлов по маске!

7.3K
08 декабря 2007 года
vova_b
49 / / 24.09.2006
Вот у меня есть прогрмка
Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

char ftype_char( mode_t m );

int main( int argc, char **argv )
{
  DIR *od;
  struct dirent *de;
  struct stat st;
  char *dirname = ".";
  char lnk[PATH_MAX];

  if( argc != 2 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }
  dirname = argv[1];

  if( chdir( dirname ) != 0 ) {
    fprintf( stderr, "Fail to make dir <%s> current: %s\n",
         dirname, strerror(errno) );
    return 2;
  };

  od = opendir( "." );
  if( ! od ) {
    fprintf( stderr, "Fail to open directory <%s>: %s\n",
         dirname, strerror(errno) );
    return 1;
  }

  while( (de = readdir(od)) != 0 ) {
    printf( "%s ", de->d_name );
    if( lstat( de->d_name, &st ) == 0 ) {
      printf( " %c %o %llu %d  ",
          ftype_char(st.st_mode), st.st_mode & 07777,
          (unsigned long long)st.st_size, st.st_nlink
        );
    } else {
      fprintf( stderr, "Fail to stat file <%s>: %s\n",
        de->d_name, strerror(errno) );
      continue;
    };
    if( S_ISLNK(st.st_mode) ) {
      memset( lnk, 0, sizeof lnk );
      if( readlink(de->d_name, lnk, sizeof(lnk)-1 ) > 0 )
    printf( " -> %s ", lnk);
    };
    printf( "\n" );
  };

  closedir( od );

  return 0;
}  

char ftype_char( mode_t m )
{
  if( S_ISREG( m ) )
    return 'f';
  if( S_ISDIR( m ) )
    return 'd';
  if( S_ISLNK( m ) )
    return 'l';
  if( S_ISCHR( m ) )
    return 'c';
  if( S_ISBLK( m ) )
    return 'b';
  if( S_ISFIFO( m ) )
    return 'p';
  if( S_ISSOCK( m ) )
    return 's';
  if( S_ISLNK( m ) )
    return 'l';
  return '?';
}

Она делает следующее:
Я её компилю и запуска ./a.out Dir
где dir это имя каталога в который программа заходит и вывод инфу о тех файлах что там находится, а надо сделать так: я запускаю ./a.out Dir mask
где mas это первые символы тех файлов про которых из данной папки надо вывести инфу, например есть папка tmp и файлы 123 321 456 123456, я запускаю программу ./a.out tmp 123
програмаа должна вывести
123 и полная инфа о файле
123456 и полная инфа о файле.
Помогите пожалуйста дописать!
502
08 декабря 2007 года
Jail
550 / / 30.01.2007
Проще всего породить новый процесс с помощью execl и использовать стандартную утилиту grep (man grep(1) в помощь) и не думать думу насчёт своего алгоритма. Если есть желание все же подумать, то лично я бы сделал так-"отбирать" входящие опции имени каталога и маски фильтруемых файлов при помощи getopt (#include <getopt.h>) или getopt_long (примеры работы с getopt могу привести, если нужно будет); затем рекурсивный просмотр директории (думаю это не затруднит); если необходимо использовать стандартные средства С, то getc() + счётчик количества совпадений (все это можно запихнуть в структуру или ещё подумать, реализаций множество), ну на С++ это реализовать можно проще да и куда изящнее, хотя С/С++ коряво справляются с текстовыми задачами, можно просто из программы запускать домустим скрипт Perl или Python(код будет компактнее и изящнее опять таки) ;)
361
09 декабря 2007 года
Odissey_
661 / / 19.09.2006
Цитата: vova_b

где mas это первые символы тех файлов про которых из данной папки надо вывести инфу,


Так видимо. Странно что вы, написав программу, не можете внести минимального изменения.

Код:
...
  if( argc != 3 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }
  ...
  dirname = argv[1];
  filemask = argv[2];
  mask_len = length(filemask);

  while( (de = readdir(od)) != 0 ) {
     // просто сравниваем начальные n - символов
    if (strncmp(de->d_name, filemask, mask_len) == 0 ) {
    printf( "%s ", de->d_name ); // <- имя файла
     ....
    };
    printf( "\n" );
  };

  closedir( od );

  return 0;
}  
}
7.3K
09 декабря 2007 года
vova_b
49 / / 24.09.2006
Цитата: Odissey_
Так видимо. Странно что вы, написав программу, не можете внести минимального изменения.
Код:
...
  if( argc != 3 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }
  ...
  dirname = argv[1];
  filemask = argv[2];
  mask_len = length(filemask);

  while( (de = readdir(od)) != 0 ) {
     // просто сравниваем начальные n - символов
    if (strncmp(de->d_name, filemask, mask_len) == 0 ) {
    printf( "%s ", de->d_name ); // <- имя файла
     ....
    };
    printf( "\n" );
  };

  closedir( od );

  return 0;
}  
}


Спасибо? не думал что так просто!:) Еще вопросик если разрешите: при компиляции выдает

 
Код:
knoppix@ttyp0[knoppix]$ cc 1.c
1.c: In function `main':
1.c:29: warning: assignment makes pointer from integer without a cast
1.c:44: warning: passing arg 3 of `strncmp' makes integer from pointer without a cast
/tmp/cchXjCsb.o(.text+0x86): In function `main':
: undefined reference to `leght'
collect2: ld returned 1 exit status

Немогу понять что ему ненравиться? также вот полность программа с тем что Вы мне подсказали дописать
Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

char ftype_char( mode_t m );

int main( int argc, char **argv )
{
  DIR *od;
  struct dirent *de;
  struct stat st;
  char *dirname = ".";
  char *filemask;
  char *mask_len;
char lnk[PATH_MAX];

  if( argc != 3 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }
  dirname = argv[1];
  filemask=argv[2];
  mask_len=leght(filemask);
  if( chdir( dirname ) != 0 ) {
    fprintf( stderr, "Fail to make dir <%s> current: %s\n",
         dirname, strerror(errno) );
    return 2;
  };

  od = opendir( "." );
  if( ! od ) {
    fprintf( stderr, "Fail to open directory <%s>: %s\n",
         dirname, strerror(errno) );
    return 1;
  }

  while( (de = readdir(od)) != 0 ) {
if(strncmp(de->d_name,filemask,mask_len)==0){    
printf( "%s ", de->d_name );
    if( lstat( de->d_name, &st ) == 0 ) {
      printf( " %c %o %llu %d  ",
          ftype_char(st.st_mode), st.st_mode & 07777,
          (unsigned long long)st.st_size, st.st_nlink
        );
    } else {
      fprintf( stderr, "Fail to stat file <%s>: %s\n",
        de->d_name, strerror(errno) );
      continue;
    };
    if( S_ISLNK(st.st_mode) ) {
      memset( lnk, 0, sizeof lnk );
      if( readlink(de->d_name, lnk, sizeof(lnk)-1 ) > 0 )
    printf( " -> %s ", lnk);
    };
    printf( "\n" );
  };

  closedir( od );

  return 0;
}  
}
char ftype_char( mode_t m )
{
  if( S_ISREG( m ) )
    return 'f';
  if( S_ISDIR( m ) )
    return 'd';
  if( S_ISLNK( m ) )
    return 'l';
  if( S_ISCHR( m ) )
    return 'c';
  if( S_ISBLK( m ) )
    return 'b';
  if( S_ISFIFO( m ) )
    return 'p';
  if( S_ISSOCK( m ) )
    return 's';
  if( S_ISLNK( m ) )
    return 'l';
  return '?';
}


Спасибо!
361
09 декабря 2007 года
Odissey_
661 / / 19.09.2006
вот это - char *mask_len; заменить на unsigned int mask_len; - это длина строки.
а mask_len=leght(filemask); заменить на mask_len=strlen(filemask); - функция вычисляющая длину строки. (виноват, перепутал функции =)).
7.3K
09 декабря 2007 года
vova_b
49 / / 24.09.2006
Цитата: Odissey_
вот это - char *mask_len; заменить на unsigned int mask_len; - это длина строки.
а mask_len=leght(filemask); заменить на mask_len=strlen(filemask); - функция вычисляющая длину строки. (виноват, перепутал функции =)).


Спасибо действительно помогло!!!!!! Вот я её скомпилировал. У меня есть папка tmp там есть фаил trash я запускаю программу ./a.out tmp tr должно показать фаил trash и информацию о нем, а нечего не показывает, что это может быть?

361
09 декабря 2007 года
Odissey_
661 / / 19.09.2006
Угу. Скобку ты не там поставил.
Ты ее после return 0; поставил, а надо перед closedir( od ); Так у тебя цикл после первой итерации выходит.
7.3K
10 декабря 2007 года
vova_b
49 / / 24.09.2006
Цитата: Odissey_
Угу. Скобку ты не там поставил.
Ты ее после return 0; поставил, а надо перед closedir( od ); Так у тебя цикл после первой итерации выходит.



Точно, это я уже туплю, все работает спасибо огромное! Не подскажешь как мне вывести больше инфы о файле там когда создан и т.д а то у меня токо права показывает а какие еще параметры задать незнаю!

7.3K
13 декабря 2007 года
vova_b
49 / / 24.09.2006
И снова я прошу помочь всех кто может.
Вот программка которую мне помогли дописать

Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

char ftype_char( mode_t m );

int main( int argc, char **argv )
{
  DIR *od;
  struct dirent *de;
  struct stat st;
  char *dirname = ".";
  char *filemask;
  unsigned int mask_len;
char lnk[PATH_MAX];

  if( argc != 3 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }
  dirname = argv[1];
  filemask=argv[2];
  mask_len=strlen(filemask);
  if( chdir( dirname ) != 0 ) {
    fprintf( stderr, "Fail to make dir <%s> current: %s\n",
         dirname, strerror(errno) );
    return 2;
  };

  od = opendir( "." );
  if( ! od ) {
    fprintf( stderr, "Fail to open directory <%s>: %s\n",
         dirname, strerror(errno) );
    return 1;
  }

  while( (de = readdir(od)) != 0 ) {
if(strncmp(de->d_name,filemask,mask_len)==0){
printf( "%s ", de->d_name );

    if( lstat( de->d_name, &st ) == 0 ) {

      printf( " %c %o %llu %d  ",
          ftype_char(st.st_mode), st.st_mode & 07777,
          (unsigned long long)st.st_size, st.st_nlink
        );
    } else {
      fprintf( stderr, "Fail to stat file <%s>: %s\n",
        de->d_name, strerror(errno) );
      continue;
    };
    if( S_ISLNK(st.st_mode) ) {
      memset( lnk, 0, sizeof lnk );
      if( readlink(de->d_name, lnk, sizeof(lnk)-1 ) > 0 )
    printf( " -> %s ", lnk);
    };
    printf( "\n" );
  };

  closedir( od );

  return 0;
}  
}
char ftype_char( mode_t m )
{
  if( S_ISREG( m ) )
    return 'f';
  if( S_ISDIR( m ) )
    return 'd';
  if( S_ISLNK( m ) )
    return 'l';
  if( S_ISCHR( m ) )
    return 'c';
  if( S_ISBLK( m ) )
    return 'b';
  if( S_ISFIFO( m ) )
    return 'p';
  if( S_ISSOCK( m ) )
    return 's';
  if( S_ISLNK( m ) )
    return 'l';
  return '?';
}


А как сделать так что когда я ее запускаю она выводила по маске не только файлы из данной дериктории но и из дерикторий вложенных в заданную дерикторию????? ПОМОГИТЕ ПОЖАЛУЙСТА!!!
361
13 декабря 2007 года
Odissey_
661 / / 19.09.2006
Цитата: vova_b
А как сделать так что когда я ее запускаю она выводила по маске не только файлы из данной дериктории но и из дерикторий вложенных в заданную дерикторию????? ПОМОГИТЕ ПОЖАЛУЙСТА!!!



Вот рабочий код.

Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>

char ftype_char( mode_t m );

int dir_info(char *dirname, char *filemask);

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

  if( argc != 3 || strcmp( "-h", argv[1]) == 0 ) {
    fprintf( stderr, "Usage: \n%s dir\n", argv[0] );
    return 1;
  }

  if( chdir( argv[1] ) != 0 )
      {
         fprintf( stderr, "Fail to make dir <%s> current: %s\n",
         argv[1], strerror(errno) );
         return 2;
      };
 
  return   dir_info(argv[1],argv[2]);
}

int dir_info(char *dirname, char *filemask)
{
  DIR *od;
  struct dirent *de;
  struct stat st;
  int mask_len;
  int ret = 0;
  char lnk[PATH_MAX];
  char file_path[PATH_MAX];
  char next_path[PATH_MAX];

  od = opendir( dirname );
  if( ! od )
      {
         fprintf( stderr, "Fail to open directory <%s>: %s\n",
         dirname, strerror(errno) );
    return 1;
  }
  mask_len = strlen(filemask);

  while( (de = readdir(od)) != 0 )
      {
        if(strncmp(de->d_name,filemask,mask_len)==0)
            {    
                printf( "%s ", de->d_name );
                sprintf(file_path, "%s/%s", dirname, de->d_name);
                if( lstat( file_path, &st ) == 0 )
                    {
                        printf( " %c %o %llu %d  ",
                        ftype_char(st.st_mode), st.st_mode & 07777, (unsigned long long)st.st_size, st.st_nlink);
                    }
                else
                    {
                        fprintf( stderr, "Fail to stat file <%s>: %s\n", de->d_name, strerror(errno) );
                        continue;
                    };
                if( S_ISLNK(st.st_mode) )
                    {
                        memset( lnk, 0, sizeof lnk );
                        if( readlink(de->d_name, lnk, sizeof(lnk)-1 ) > 0 )
                        printf( " -> %s ", lnk);
                    };
                printf( "\n" );
            };
            if ((strcmp(de->d_name,".") != 0 ) && (strcmp(de->d_name,"..") != 0) &&
                (lstat( de->d_name, &st ) == 0))
                if(S_ISDIR(st.st_mode))
                    {
                        sprintf(next_path, "%s/%s", dirname, de->d_name);
                        ret |=  dir_info(next_path, filemask);
                    }
        }

  closedir( od );
  return ret;
};


char ftype_char( mode_t m )
{
  if( S_ISREG( m ) )
    return 'f';
  if( S_ISDIR( m ) )
    return 'd';
  if( S_ISLNK( m ) )
    return 'l';
  if( S_ISCHR( m ) )
    return 'c';
  if( S_ISBLK( m ) )
    return 'b';
  if( S_ISFIFO( m ) )
    return 'p';
  if( S_ISSOCK( m ) )
    return 's';
  if( S_ISLNK( m ) )
    return 'l';
  return '?';
}


Прошу темы подобного рода постить в разделе студентам.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог