Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Findfirst... и подобное в Си

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> Findfirst... и подобное в Си
Имя
Сообщение << Старые топики   Новые топики >>
Findfirst... и подобное в Си - 2005-02-26 17:50:34   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Всем привет! :)
Если кто-то сталкивался с функциями типа findfirst, findnext в Сишке, просьба написать что-нибудь про их использование. Справку почитала - маловато как-то… [sm=19.gif]
Да-да, вот сейчас с форума выйду и сразу на гугл, на гугл… :)
Хелп плиз!! [sm=3.gif]
Post #: 1
Findfirst... и подобное в Си - 2005-02-26 17:55:54   
ни разу не дигитал ака свалил

Сообщений: 695
Оценки: 0
Присоединился: 2005-02-22 19:55:08
а ты не выходя на гугл…на гугл
Post #: 2
Findfirst... и подобное в Си - 2005-02-26 18:04:28   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Содержательный ответ :)
На самом деле я пока ссылочки просматриваю на гугле, но там в основном всё про Паскаль… Вот я не знаю… Скорее всего, сами механизмы на Си такие же, просто синтаксис немножечко другой…
Хелп!!!! [sm=sm128.gif]
Post #: 3
Findfirst... и подобное в Си - 2005-02-26 18:09:26   
GorluM

Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00



—————-
Цитата: Дата: 26.02.2005 17:50:34, Автор:Edelweiss ::


Всем привет! :)
Если кто-то сталкивался с функциями типа findfirst, findnext в Сишке, просьба написать что-нибудь про их использование. Справку почитала - маловато как-то…
Да-да, вот сейчас с форума выйду и сразу на гугл, на гугл… :)
Хелп плиз!!

—————-

просвети, что такое findfirst?


точнее, финддферст чего?

Post #: 4
Findfirst... и подобное в Си - 2005-02-26 18:10:37   
ни разу не дигитал ака свалил

Сообщений: 695
Оценки: 0
Присоединился: 2005-02-22 19:55:08
Да я в Си не разбираюсь совсем так что хз.
Post #: 5
Findfirst... и подобное в Си - 2005-02-26 18:18:56   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
2Горлум:
Я пишу прогу на Си, которая должна искать указанную комбинацию символов в файлах, соответствующих маске.
Для того, чтобы найти конкретные файлы (а с одним и тем же именем можно мнооооого таких файлов найти!), а уж тем более файлы с маской типа *.*, *.?x? и прочих и необходимы эти две функции.
Сама с ними никогда не работала, вот и спрашиваю :)
Post #: 6
Findfirst... и подобное в Си - 2005-02-26 18:54:06   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
[sm=em88.gif] [sm=em88.gif] [sm=em88.gif]
Post #: 7
Findfirst... и подобное в Си - 2005-02-26 22:08:38   
GorluM

Сообщений: 312
Оценки: 0
Присоединился: 2004-04-07 23:41:00



—————-
Цитата: Дата: 26.02.2005 18:18:56, Автор:Edelweiss ::


2Горлум:
Я пишу прогу на Си, которая должна искать указанную комбинацию символов в файлах, соответствующих маске.
Для того, чтобы найти конкретные файлы (а с одним и тем же именем можно мнооооого таких файлов найти!), а уж тем более файлы с маской типа *.*, *.?x? и прочих и необходимы эти две функции.
Сама с ними никогда не работала, вот и спрашиваю :)
—————-

Ну, для начала повредничаю. RTFM.


Теперь несколько более конкретно: В windоws API функции есть FindFirstFile и FindNextFile:


HANDLE FindFirstFile(
  LPCTSTR
lpFileName,               // file name
  LPWIN32_FIND_DATA lpFindFileData  // data buffer
);


BOOL FindNextFile(
  HANDLE
hFindFile,                // search handle
  LPWIN32_FIND_DATA lpFindFileData // data buffer
);


В рантайме же есть такие функции:


intptr_t _findfirst(
   const char *filespec,
   struct _finddata_t *fileinfo
);
int _findnext(
intptr_t handle,
   struct _finddata_t *fileinfo
);



Post #: 8
Findfirst... и подобное в Си - 2005-02-26 23:09:50   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Я не знаю, что такое Выньдос Апи… Просвети меня, пожалуйста!!!! [sm=16.gif]
Post #: 9
Findfirst... и подобное в Си - 2005-02-26 23:20:31   
_P_I_H_A_R_ агейн!

Сообщений: 206
Оценки: 0
Присоединился: 2005-02-25 16:32:56
quote:

—————-<BR>Цитата: Дата:26.02.2005 23:09:50, Автор:Edelweiss ::
Я не знаю, что такое Выньдос Апи… Просвети меня, пожалуйста!!!! [sm=16.gif]
—————-




….боюсь сейчас ты ее как раз наблюдаешь…)))
Post #: 10
Findfirst... и подобное в Си - 2005-02-27 00:27:28   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Нет, банальная совокупность функций и системных вызовов, которой пользуется выньдос для управления самой собой, мне знакома…
А вот что это по-русски и более детально, с подробностями, я не понимаю ещё… [sm=sm128.gif]
Post #: 11
Findfirst... и подобное в Си - 2005-02-27 00:28:05   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Тебя что, опять банили??? Что ник новый? :)
Post #: 12
Findfirst... и подобное в Си - 2005-03-01 02:09:59   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
РЕБЯТА!!!
Очень срочно надо!!!
В четверг нужна готовая прога, которая будет по маске файла искать в соответствующих файлах указанную последовательность символов…. Нужно предусмотреть случай с рекурсией и с учётом регистра… ХЕЛП!!!!!!!!!!!!
Post #: 13
Findfirst... и подобное в Си - 2005-03-01 02:25:01   
Shmatya

Сообщений: 1
Оценки: 0
Присоединился: 2005-02-28 15:27:31
Здравствуйте !Помогите !Где можно найти редактор программ для С++?
Post #: 14
Findfirst... и подобное в Си - 2005-03-01 05:21:21   
Lex_Voodoo

Сообщений: 7328
Оценки: 0
Присоединился: 2004-12-07 13:55:12
quote:

—————-<BR>Цитата: Дата:01.03.2005 2:09:59, Автор:Edelweiss ::
РЕБЯТА!!!<BR><BR>Очень срочно надо!!!<BR><BR>В четверг нужна готовая прога, которая будет по маске файла искать в соответствующих файлах указанную последовательность символов…. Нужно предусмотреть случай с рекурсией и с учётом регистра… ХЕЛП!!!!!!!!!!!!
—————-



Эх, с удовольствием бы помог, но в сях ни бум-бум!
Мог бы даже выучить этот язык, но до четверга, боюсь, не успею…
Народ! Я чего-то не понимаю? На PHP это пишется в две строчки, НЕУЖЕЛИ ТУТ НЕТ СПЕЦОВ В С?
Да я больше, чем уверен, что там есть те же RegExp - ну не может их там не быть - ведь PHP сам написан на C++!!!

В конце концов, ведь девушка просит [sm=sm203.gif]
Post #: 15
Findfirst... и подобное в Си - 2005-03-01 06:11:37   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
PHP потому и называется PHP а не C потому-что там всё просто, также и в любом соммандном интерпретаторе это делается одной командой, а в С функции stat, open, close в вашем полном распоряжении (в *nix такие syscalls есть). А также см. функции opendir, readdir, closedir, rewinddir, seekdirt, telldir. Все эти замороки находятся в файле dirent.h.

PS а не писал потому что
a) думал что для того чтобы выяснить как это делать надо просто открыть либо доку по libc, либо (в винде) по win32api, там всё подробно написано
b) всё таки разговор идет про поиск по шаблону а эти функции про шаблоны ничего не знают, и надо либо всё делать ручками либо отказыватся от шаблонов файлов которые пользует shell и юзать библиотеку regex.
PPS может и зря не писал [sm=9.gif]
Post #: 16
Findfirst... и подобное в Си - 2005-03-01 06:20:10   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
А насчет проги в четверг. Ради красивого личика Edelweiss я могу её написать целиком, ежели мне кто-нибудь выдаст спецификацию шаблона для файла.
Post #: 17
Findfirst... и подобное в Си - 2005-03-01 08:40:27   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
вот. только что есть шаблон я не знаю. у меня в linux'е работает под досовую файловую систему делать не умею

/* младший брат ls. */

#include <alloca.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
/* system config */

#ifndef PATH_MAX
/* вообще эта хрень должна быть определена в limits.h
* но написано что этого ограничения может и не быть :(
* если это существенно то надо реализовывать список…
* да и вообще проще повеситься
*/
#define PATH_MAX 2048
#endif

/* options */
int recursive = 0;

/* globals */
/* const char path_sep — разделитель пути файла */
const char path_sep = '/';

char *program_name;

/* char pwd[] — путь к той директории с которой мы в
* данный момент работаем, либо абсолютный, либо относительный
* от текущей директории процесса */
char pwd[PATH_MAX+1] = "";

/* char *pwd_elems[] — указатели в разные части массива pwd
* pwd_elems[и] == path_sep || pwd_elems[и] == '\0' */
char *pwd_elems[PATH_MAX];

int depth = 0; /* pwd_elems[depth] == "" */

char *pattern = "*";

/* void init_pwd: инициализирует pwd_elems */
static void init_pwd ()
{
char *p = pwd;
int k;
for (k = 0; k < PATH_MAX; k ++) {
char *tmp;
pwd_elems[k] = p;
tmp = strchr (p, path_sep);
if (tmp == 0)
break;
p = tmp + 1;
}
if (k == PATH_MAX) {
fprintf (stderr, "%s: init_pwd: this is probably a bug.\n",
program_name);
exit (1);
}
p += strlen (p);
if (p[-1] != path_sep) {
*(p++) = path_sep;
*p = '\0';
}
pwd_elems[k] = p;
depth = k;
}
/*void set_start_path: приводит path к каноническому виду и копирует
* в pwd */
void set_start_path (char *path)
{
char *tmp = strchr (path, path_sep);
if (tmp == path) {/* если абсолютный путь, тут по большому счёту надо
* писать
`#if defined(DOS)
#elif defined(POSIX) || defined (UNIX)
#endif'
*/
strncpy (pwd, path, PATH_MAX);
} else if (tmp == 0 || /* нет ни одного разделителя */
strncmp (path, ".", tmp - path - 1) || /* и это не начало */
strncmp (path, "..", tmp - path - 1)) {/* относительного пути*/
snprintf (pwd, PATH_MAX, ".%c%s", path_sep, path);
} else {
strncpy (pwd, path, PATH_MAX);
}

}
/* int check_pattern: проверяет подходит ли строка file под шаблон pattern
* FIXME: not written yet
*/
int check_pattern (const char *file, const char *pattern)
{
return 1;
}
int do_recursive_call (char *sub_dir);
/* int check_dir: ищет все совпадения в pwd и если надо в поддиректориях */
int check_dir ()
{
DIR *dir;
struct dirent *cur;
dir = opendir (pwd);
if (dir == 0) {
char *tmp = alloca (strlen (pwd) + sizeof ("Unable to open "));
sprintf (tmp, "Unable to open %s\n", pwd);
perror (tmp);
return 0;
}
while ((cur = readdir (dir)) != 0) {
if (check_pattern (cur->d_name, pattern))
printf ("%s%s\n", pwd, cur->d_name);

if (recursive && cur->d_type == DT_DIR)
do_recursive_call (cur->d_name);
}
closedir (dir);
return 1;
}
/* int do_recursive_call: поддерживает depth, pwd и pwd_elems в
* надлежащем состоянии и собственно делает рекурсивный вызов check_dir */
int do_recursive_call (char *sub_dir)
{
char *pwd_pos = pwd_elems[depth];
size_t pwd_len = pwd_pos - pwd;
int len = strlen (sub_dir);
if (strcmp (sub_dir, ".") == 0 ||
strcmp (sub_dir, "..") == 0)
return 0;
if (pwd_len + len >= PATH_MAX) {
fprintf (stderr, "%s: PATH_MAX reached.\n", program_name);
return 0;
}
strcpy (pwd_pos, sub_dir);
pwd_pos[len] = path_sep;
pwd_pos[len+1] = 0;
pwd_elems[depth + 1] = pwd_elems[depth] + len + 1;
depth ++;
check_dir ();
pwd_elems[depth] = 0;
depth –;
pwd_pos[0] = '\0';
return 1;
}

int main (int argc, char *argv[])
{
program_name = strdup (argv[0]);
argc –;
argv ++;

while (argc > 0) {
if (strcmp (argv[0], "-R") == 0)
recursive = 1;
else if (strcmp (argv[0], "-d") == 0) {
argv ++;
argc –;
if (argc == 0) {
fprintf (stderr, "%s: `-d' without dir.\n",
program_name);
return 1;
}
set_start_path (argv[0]);
} else {
pattern = strdup (argv[0]);
break;
}
argv ++;
argc –;
}
if (argc != 0) {
fprintf (stderr, "%s: extra path arguments after pattern.\n",
program_name);
} else if (pwd[0] == '\0') {
sprintf (pwd, ".%c", path_sep);
}
init_pwd ();
return !check_dir ();
}
Post #: 18
Findfirst... и подобное в Си - 2005-03-01 17:50:51   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Я ВАС ПРОСТО ОБОЖАЮ!!!!!!!!!!!!!!!!! [sm=1.gif] [sm=1.gif] [sm=1.gif] [sm=1.gif] [sm=1.gif]
Post #: 19
Findfirst... и подобное в Си - 2005-03-01 17:51:22   
Edelweiss

Сообщений: 174
Оценки: 0
Присоединился: 2005-01-11 22:14:41
Осталось только всё понять и разобрать :)
Post #: 20
Findfirst... и подобное в Си - 2005-03-02 07:35:53   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
Значит так. Завершённая программа. но подленький вопрос: действительно ли нужен ли весь этот геморрой с поиском файлов? Вообще-то в реальных программах никто этого не делает, вся эта работа производится командным интерпретатом. Если не надо, то программа станет раз в пять-десять меньше.


/* неполноценный потомок брака ls и grep */

#include <alloca.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/stat.h>
/* system config */

#ifndef PATH_MAX
/* вообще эта хрень должна быть определена в limits.h
* но написано что этого ограничения может и не быть :(
* ежели ограничения нету, то проблемы теперь будут только
* в main
*/
#define PATH_MAX 2048
#endif

/* options */
/* опций не осталось :) */

/* globals */

/* const char path_sep — разделитель пути файла */
const char path_sep = '/';
/* const char *str_path_sep — разделитель пути файла в виде строки */
const char str_path_sep[] = "/";

const char usage[] =
"usage:\n"
"%1$s TEXT [FILE_PATTERN1] [FILE_PATTERN2] …\n"
" %1$s searches all lines of files\n"
" that maches to patterns on cmnline\n"
" or stdin for TEXT\n";

char *program_name;

/* char pwd[] — путь к той директории с которой мы в
* данный момент работаем, либо абсолютный, либо относительный
* от текущей директории процесса */
char *pwd;

/* pwd_size: current malloced size of pwd */
int pwd_size = 0;

/* pwd_last: pwd[pwd_last] == '\0' */
int pwd_last = 0;

/* pattern: ARGVZ вектор, шаблон типа share/*e/include
* будет храниться как "share\0*e\0include\0\0" */
/* не знаю какой библиотекой C ты пользуешься а glibc есть
* набор функций для работы с такими векторами */
char *pattern = "*\0";

/* char **ptrn_elems: указатели на элементы pattern */
char **ptrn_elems = 0;

/* int ptrn_elems_size: длина ptrn_elems */
int ptrn_elems_size = 0;


int depth = 0; /* ptrn_elems[depth] == "" */


/* char *text_pattern: шаблон строки которые ищем в файлах */
char *text_pattern;

void set_text_pattern (char *ptrn)
{
int len = strlen (ptrn);
text_pattern = (char *)malloc (len + 3);
sprintf (text_pattern, "*%s*", ptrn);
}

/* do_push_dir: копирует максимум len байт из src в pwd,
* изменяя размер pwd если требуется
*/
static char* do_push_dir (const char *src, int len)
{
int dlen;
if (pwd == 0)
dlen = 0;
else
dlen = pwd_last;
if (pwd_size <= dlen + len) {
char *tmp = realloc (pwd, pwd_size + dlen + len + 32);
if (tmp == 0) {
fprintf (stderr, "%s: fatal error: no memory.\n",
program_name);
exit (1);
}
pwd = tmp;
pwd_size += dlen + len + 32;
}
strncpy (&pwd[dlen], src, len);
pwd_last = len + dlen;
pwd[pwd_last] = '\0';
return &pwd[pwd_last];
}

/* init_pattern: инициализирует ptrn_elems, опираясь на значение pattern */
static inline void init_pattern ()
{
char *tmp;
int k;
/* найти количество элементов pattern */
for (k = 0, tmp = pattern;
(tmp = strchr (tmp, path_sep)) != 0;
tmp ++, k ++);
/* если надо realloc ptrn_elems
* (здесь пользуется free/malloc дабы избежать ненужного
* в данной ситуации
* копирования которое делает realloc) */
if (ptrn_elems_size < k+2) {
free (ptrn_elems);
ptrn_elems = (char**)malloc ((k + 2) * sizeof (char*));
}
/* собственно инициализировать ptrn_elems */
ptrn_elems[0] = pattern;
for (k = 1, tmp = pattern;
(tmp = strchr (tmp, path_sep)) != 0;
k ++, tmp ++) {
ptrn_elems[k] = &tmp[1];
tmp[0] = '\0';
}
ptrn_elems[k] = ptrn_elems[k-1] + strlen (ptrn_elems[k-1]);
}
/* dup_non_pattern_path: выковыривает из шаблона полученного
* из командной строки начало пути не содержащее спец символов
* (ex. из ../usr/include/dirent* получится ../usr/include/)
*/
static char const* dup_non_pattern_path (const char *ptrn)
{
const char* pstart = strpbrk (ptrn, "*?");
const char* tmp;
if (pstart == 0) { /* ежели вообще нет спец символов */
/* выясним что енто за файл */
struct stat s;
int res;
res = stat (ptrn, &s);
if (res < 0) { /* проблемы… */
return 0;
}
if ((s.st_mode & S_IFMT) != S_IFDIR) {/* если не директория */
char *fname = strrchr (ptrn, path_sep);
if (tmp == 0) /* лежит прямо в текущей */
tmp = do_push_dir ("", 0);
else
tmp = do_push_dir (ptrn, fname - ptrn);
pstart = &fname[1];
} else {
tmp = do_push_dir (ptrn, strlen (ptrn));
pstart = &ptrn[strlen (ptrn)];
}
} else {
/* найти последний `/' */
while (pstart != ptrn && *(–pstart) != path_sep);
if (pstart != ptrn) { /* если найден */
pstart ++;
tmp = do_push_dir (ptrn, pstart - ptrn);
} else {
tmp = do_push_dir ("", 0);
}
}
if (pwd[0] != '\0' && tmp[-1] != path_sep) {
/* если последний символ полученного пути не '/' */
do_push_dir (str_path_sep, 1);
}
return pstart;
}

/* init_pwd_pattern: инициализирует pwd, pattern и связанные с ними globals */
static int init_pwd_pattern (const char *ptrn)
{
const char *tmp;
tmp = dup_non_pattern_path (ptrn);
if (tmp == 0)
return 0;
if (tmp[0] != '\0')
pattern = strdup (tmp);
else
pattern = "*\0";
init_pattern ();
return 1;
}
/* push_dir: все неободимые изменения globals при переходе в
* поддиректорию (заодно апдейтит текущую директорию процесса)
*/
int push_dir (char *dname)
{
int len = strlen (dname);
char *tmp = (char *)alloca ((len + 2) * sizeof (char));
if (chdir (dname))
return 0;
len = sprintf (tmp, "%s%c", dname, path_sep);
do_push_dir (tmp, len);
depth ++;
return 1;
}
/* push_dir: все неободимые изменения globals при выходе из
* поддиректории (заодно апдейтит текущую директорию процесса)
*/
void pop_dir ()
{
char *p = &pwd[pwd_last-1];
while (*(–p) != path_sep);
p[1] = '\0';
pwd_last = p - pwd + 1;
depth –;
chdir ("..");
}
/* int check_pattern: проверяет подходит ли строка file под шаблон pattern
*/
int check_pattern (const char *file, const char *pattern)
{
while (file[0] != '\0') {
switch (pattern[0]) {
case '?':
file ++;
pattern ++;
break;
case '*':
if (pattern[1] == file[0])
if (check_pattern (&file[1], &pattern[2]))
return 1;

file ++;
break;
case '\0':
if (file[0] != '\0')
return 0;
else
return 1;
break;
default:
if (file[0] == pattern[0]) {
file ++;
pattern ++;
} else
return 0;
break;
}
}
if ((pattern[0] == '*' && pattern[1] == '\0') ||
pattern[0] == '\0')
return 1;
else
return 0;
}
char *get_line (FILE *f)
{
char *buf = (char*)malloc (1024);
int buf_size = 1024;
int k;
if (buf == 0) {
fprintf (stderr,
"%s: fatal error: no memory.\n",
program_name);
exit (1);
}
for (k = 0; 1; k ++) {
if (k >= buf_size) {
char *tmp = (char*)
realloc (buf, (buf_size + 1024) * sizeof (char));
if (tmp == 0) {
fprintf (stderr,
"%s: too long lines in input.\n",
program_name);
exit (1);
}
buf_size += 1024;
buf = tmp;
}
buf[k] = fgetc (f);
if (buf[k] == '\n' || buf[k] == EOF) {
buf[k] = '\0';
break;
}
}
return buf;
}
void check_file (FILE *file, char *name)
{
while (!feof (file)) {
char *line = get_line (file);
if (check_pattern (line, text_pattern))
printf ("%s: %s\n", name, line);
free (line);
}
}
void try_check_file (struct dirent *file)
{
FILE *f;
if (file->d_type == DT_REG) {
f = fopen (file->d_name, "r");
if (f != 0)
check_file (f, file->d_name);
}
}
int do_recursive_call (char *sub_dir);
/* int check_dir: ищет все совпадения в pwd и если надо в поддиректориях */
int check_dir ()
{
DIR *dir;
struct dirent *cur;
dir = opendir (".");
if (dir == 0) { /* это вряд ли но бывает */
char *tmp = alloca (strlen (pwd) + sizeof ("Unable to open "));
sprintf (tmp, "Unable to open %s\n", pwd);
perror (tmp);
return 0;
}
while ((cur = readdir (dir)) != 0) {
if (check_pattern (cur->d_name, ptrn_elems[depth])) {
if (ptrn_elems[depth+1][0] == '\0') {
/* если последний элт паттерна */
printf ("%s%s:\n", pwd, cur->d_name);
try_check_file (cur);
} else if (cur->d_type == DT_DIR)
do_recursive_call (cur->d_name);
/* здесь следует обрабатывать также
* символические ссылки:
* if (cur->d_type == DT_REG) …
* я этого не делаю т.к.
* a) не знаю умеет ли твоя стндрная
* библтка с ними работать (функция stat)
* b) если работать то надо вычислять цикличность
* пути и обрывать (хотя в данной программе
* не надо: длина пути ограничена шаблоном)
*/
}
}
closedir (dir);
return 1;
}
/* int do_recursive_call: поддерживает depth, pwd и pwd_elems в
* надлежащем состоянии и собственно делает рекурсивный вызов check_dir */
int do_recursive_call (char *sub_dir)
{
if (strcmp (sub_dir, ".") == 0 ||
strcmp (sub_dir, "..") == 0)
return 0;

if (!push_dir (sub_dir))
return 0;
check_dir ();
pop_dir ();
return 1;
}

int main (int argc, char *argv[])
{
int flag = 0;
program_name = strdup (argv[0]);
if (argc < 2) {
fprintf (stderr, usage, program_name);
return 1;
}
argc –;
argv ++;
set_text_pattern (argv[0]);
argc –;
argv ++;
while (argc > 0) {
/* glibc позволяет получить текущую директорию
* в динамически выделенном буфере, но это расширение
* стандарта POSIX.1 и вряд ли поэтому широко поддерживается :(
* поэтому либо куча геморроя либо так: */
char cwd[PATH_MAX];

if (init_pwd_pattern (argv[0])) {
getcwd (cwd, PATH_MAX);
chdir (pwd);
check_dir ();
chdir (cwd);
}
flag = 1;
argv ++;
argc –;
}
if (!flag)
check_file (stdin, "stdin");
return 0;
}
Post #: 21
Страниц:  [1]
Все форумы >> [Веб-программинг] >> Findfirst... и подобное в Си







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.