Функция для чтения файлов по одному в каталоге
-
19-09-2019 - |
Вопрос
Я реализую SMTP-отправитель на C, который должен читать файл из каталога всякий раз, когда он создается, обрабатывать данные и удалять файл.
Как я могу реализовать эту функцию опроса, которая должна делать это автоматически?
Решение
Простой вариант — периодически запускать вашу программу из хрон.Программа может использовать вызов Linux API каталог чтения для перебора каталога.Ему не обязательно активно следить за каталогом.
Вот простой пример кода:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main()
{
DIR* dp = opendir(".");
struct dirent* de;
while (de = readdir(dp))
{
if (de->d_type != DT_REG) // Only print regular files
continue;
printf("Found file %s\n", de->d_name);
}
closedir(dp);
}
Отказ от ответственности:Для простоты я не включил код для проверки или обработки ошибок.
Другие советы
Посмотрите уведомлять и посмотрите, хватит ли этого для ваших нужд.inotify позволяет вам использовать один файловый дескриптор для мониторинга событий в целевом каталоге.Вы можете избежать опроса, используя select(), и будете немедленно уведомлены о любых файлах, созданных в каталоге, чтобы вы могли выполнить обработку.
Эта статья есть пример кода.Я уверен, что в сети есть и другие примеры.
Судя по вашему вопросу, это хороший случай для межпроцессного взаимодействия.
Вы говорите, что вам нужно получать уведомление при создании файла в каталоге.На мой взгляд, межпроцессное взаимодействие через файлы — это плохо.
В Unix у вас есть несколько альтернатив межпроцессного взаимодействия: это руководство подробности.С использованием Unix-сокеты был бы самый простой путь.
Если вы написали другой процесс, который теперь создает файл для межпроцессного взаимодействия, вы можете изменить реализацию, чтобы записать его в сокет.