Эмуляция команды поиска в C - PullRequest
1 голос
/ 14 августа 2011

Каков наилучший способ сделать это на языке программирования C?

find fileName

Ответы [ 3 ]

4 голосов
/ 14 августа 2011

Посмотрите на функцию POSIX nftw(). Он разработан как функция «обход дерева нового файла».

Есть связанная, но не сразу полезная функция scandir(), которую вы можете использовать. Например, функция выбора может использоваться для вызова рекурсивного сканирования подкаталогов, но, возможно, nftw() более уместно.

2 голосов
/ 14 августа 2011

Вы можете вызвать find из разветвленного дочернего процесса и получить обратно вывод find из канала:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFSIZE 1000

int main(void) {
  int pfd[2], n;
  char str[BUFSIZE + 1];

  if (pipe(pfd) < 0) {
    printf("Oups, pipe failed.  Exiting\n");
    exit(-1);
  }

  n = fork();

  if (n < 0) {
    printf("Oups, fork failed.  Exiting\n");
    exit(-2);
  } else if (n == 0) {
    close(pfd[0]);

    dup2(pfd[1], 1);
    close(pfd[1]);

    execlp("find", "find", "filename", (char *) 0);
    printf("Oups, execlp failed.  Exiting\n"); /* This will be read by the  parent. */
    exit(-1); /* To avoid problem if execlp fails, especially if in a loop. */
  } else {
    close(pfd[1]);

    while ((n = read(pfd[0], str, BUFSIZE)) > 0) {
      str[n] = '\0';
      printf("%s", str);
    }

    close(pfd[0]);
    wait(&n); /* To avoid the zombie process. */

    if (n != 0) {
       printf("Oups, find or execlp failed.\n");
    }
  }
}
1 голос
/ 14 августа 2011

Это сложная тема. Взгляните на документацию GNU libc . Затем попробуйте отсканировать текущий каталог, используя scandir. Если это работает, вы можете реализовать рекурсивную версию, предполагая, что вы говорите о команде поиска UNIX и хотите выполнить рекурсивный поиск по именам файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...