#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 и полная инфа о файле.
Помогите пожалуйста дописать!
Проще всего породить новый процесс с помощью execl и использовать стандартную утилиту grep (man grep(1) в помощь) и не думать думу насчёт своего алгоритма. Если есть желание все же подумать, то лично я бы сделал так-"отбирать" входящие опции имени каталога и маски фильтруемых файлов при помощи getopt (#include <getopt.h>) или getopt_long (примеры работы с getopt могу привести, если нужно будет); затем рекурсивный просмотр директории (думаю это не затруднит); если необходимо использовать стандартные средства С, то getc() + счётчик количества совпадений (все это можно запихнуть в структуру или ещё подумать, реализаций множество), ну на С++ это реализовать можно проще да и куда изящнее, хотя С/С++ коряво справляются с текстовыми задачами, можно просто из программы запускать домустим скрипт Perl или Python(код будет компактнее и изящнее опять таки) ;)
Цитата: 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;
}
}
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;
}
}
Цитата: 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;
}
}
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
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 '?';
}
#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 '?';
}
Спасибо!
а mask_len=leght(filemask); заменить на mask_len=strlen(filemask); - функция вычисляющая длину строки. (виноват, перепутал функции =)).
Цитата: Odissey_
вот это - char *mask_len; заменить на unsigned int mask_len; - это длина строки.
а mask_len=leght(filemask); заменить на mask_len=strlen(filemask); - функция вычисляющая длину строки. (виноват, перепутал функции =)).
а mask_len=leght(filemask); заменить на mask_len=strlen(filemask); - функция вычисляющая длину строки. (виноват, перепутал функции =)).
Спасибо действительно помогло!!!!!! Вот я её скомпилировал. У меня есть папка tmp там есть фаил trash я запускаю программу ./a.out tmp tr должно показать фаил trash и информацию о нем, а нечего не показывает, что это может быть?
Ты ее после return 0; поставил, а надо перед closedir( od ); Так у тебя цикл после первой итерации выходит.
Цитата: Odissey_
Угу. Скобку ты не там поставил.
Ты ее после return 0; поставил, а надо перед closedir( od ); Так у тебя цикл после первой итерации выходит.
Ты ее после return 0; поставил, а надо перед closedir( od ); Так у тебя цикл после первой итерации выходит.
Точно, это я уже туплю, все работает спасибо огромное! Не подскажешь как мне вывести больше инфы о файле там когда создан и т.д а то у меня токо права показывает а какие еще параметры задать незнаю!
Вот программка которую мне помогли дописать
Код:
#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 '?';
}
#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 '?';
}
А как сделать так что когда я ее запускаю она выводила по маске не только файлы из данной дериктории но и из дерикторий вложенных в заданную дерикторию????? ПОМОГИТЕ ПОЖАЛУЙСТА!!!
Цитата: 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 '?';
}
#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 '?';
}
Прошу темы подобного рода постить в разделе студентам.