Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

14.7.3. Реализация

find

Команда

find
выполняет в одном или нескольких деревьях каталогов поиск файлов, соответствующих определенным характеристикам. Ниже приведена простая реализация
find
, реализованная на основе
nftw
. Она использует
fnmatch
(см. главу 23) для реализации переключателя
– name
и иллюстрирует многие флаги, воспринимаемые
nftw
.

 1: /* find.с */

 2:

 3: #define _XOPEN_SOURCE 600

 4:

 5: #include <fnmatch.h>

 6: #include <ftw.h>

 7: #include <limits.h>

 8: #include <stdio.h>

 9: #include <stdlib.h>

10: #include <string.h>

11:

12: const char * name = NULL;

13: int minDepth = 0, maxDepth = INT_MAX;

14:

15: int find (const char * file, const struct stat * sb, int flags,

16: struct FTW * f) {

17: if (f->level < minDepth) return 0;

18: if (f->level > maxDepth) return 0;

19: if (name && fnmatch(name, file + f->base, FNM_PERIOD)) return 0;

20:

21: if (flags == FTW_DNR) {

22: fprintf(stderr, "find: %s:
недопустимые полномочия\n", file);

23: } else {

24: printf("%s\n", file);

25: }

26:

27: return 0;

28: }

29:

30: int main(int argc, const char ** argv) {

31: int flags = FTW_PHYS;

32: int i;

33: int problem = 0;

34: int tmp;

35: int rc;

36: char * chptr;

37:

38: /* поиск первого параметры командной строки (который должен

39: находиться после списка путей */

40: i = 1;

41: while (i < argc && *argv[i] != '-') i++;

42:

43: /* обработать опции командной строки */

44: while (i < argc && !problem) {

45: if (!strcmp(argv[i], "-name")) {

46: i++;

47: if (i == argc)

48: problem = 1;

49: else

50: name = argv[i++];

51: } else if (!strcmp(argv[i], "-depth")) {

52: i++;

53: flags |= FTW_DEPTH;

54: } else if (!strcmp (argv[i], "-mount") ||

55: !strcmp(argv[i], "-xdev")) {

56: i++;

57: flags |= FTW_MOUNT;

58: } else if (!strcmp (argv[i], "-mindepth") ||

59: !strcmp (argv[i], "-maxdepth")) {

60: i++;

61: if (i == argc)

62: problem = 1;

63: else {

64: tmp = strtoul(argv[i++], &chptr, 10);

65: if (*chptr)

66: problem = 1;

67: else if (!strcmp(argv[i - 2], "-mindepth"))

68: minDepth = tmp;

69: else

70: maxDepth = tmp;

71: }

72: }

73: }

74:

75: if (problem) {

76: fprintf(stderr, "использование: find <пути> [-name <строка>]"

77: "[-mindepth <целое>] [-maxdepth <целое>]\n");

78: fprintf(stderr, " [-xdev] [-depth]\n");

79: return 1;

80: }

81:

82: if (argc == 1 || *argv[1] == '-') {

83: argv[1] = ".";

84: argc = 2;

85: }

86:

87: rc = 0;

88: i = 1;

89: flags = 0;

90: while (i < argc && *argv[i] != '-')

91: rc |= nftw (argv [i++], find, 100, flags);

92:

93: return rc;

94: }

14.8.

Уведомление о смене каталога

Иногда приложения желают получать уведомления об изменении оглавления каталога. Например, диспетчеры файлов могут выводить оглавление каталога в окне и обновлять это окно каждый раз при изменении каталога другими программами. В то время как приложение регулярно перепроверяет каталог, Linux может послать программе сигнал о модификации каталога, позволяя своевременные обновления без накладных расходов и задержек на страничный обмен.

Поделиться:
Популярные книги

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Экономка тайного советника

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Экономка тайного советника

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Бестужев. Служба Государевой Безопасности. Книга вторая

Измайлов Сергей
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая

Метатель. Книга 3

Тарасов Ник
3. Метатель
Фантастика:
попаданцы
альтернативная история
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 3

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Ты не мой BOY

Рам Янка
5. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты не мой BOY

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Лекарь для захватчика

Романова Елена
Фантастика:
попаданцы
историческое фэнтези
фэнтези
5.00
рейтинг книги
Лекарь для захватчика

Отверженный VI: Эльфийский Петербург

Опсокополос Алексис
6. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VI: Эльфийский Петербург

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Темный Лекарь 11

Токсик Саша
11. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 11