2015-04-10 10 views
3

У меня есть около 50 файлов, которые перемещаются в каталог «/ tmp» в некоторый промежуток времени, когда его изменение изменяется. Я использую inotify, чтобы посмотреть этот каталог/tmp для этих файлов, перемещенных в этот каталог, чтобы я мог объединить эти файлы в другой файл в другом каталоге.Как посмотреть каталог с несколькими изменениями файлов, используя inotify в c

Но скорость, с которой файлы, перемещаемые в этот каталог ("/ tmp"), inotify, не могут предоставлять уведомления для других файлов, кроме одного файла.

Как просмотреть каталог, если несколько файлов с разными именами (неизвестными именами) создаются или перемещаются в каталог с помощью inotify.

Я знаю, что могу создать несколько часовых дескрипторов для каждого файла с его именем. Но я не знаю, какое имя файла создается или перемещается в этот каталог. Динамически файлы создаются, поэтому я не могу создавать дескрипторы часов для каждого файла.

Ниже приведен мой код.

Как проверить уведомления для нескольких файлов gettign, созданных в этом каталоге.

Пожалуйста, помогите с решением проблемы. Ваша помощь очень ценится. Благодаря

int main(int argc, char **argv) 
{ 
    int length, i = 0; 
    int fd; 
    int wd; 
    char buffer[BUF_LEN]; 

    fd = inotify_init(); 

    if (fd < 0) { 
     perror("inotify_init"); 
    } 

    wd = inotify_add_watch(fd, "/tmp/", IN_MOVED_TO); 


    while (1){ 
     struct inotify_event *event; 

     length = read(fd, buffer, BUF_LEN); 

     if (length < 0) { 
      perror("read"); 
     } 

     event = (struct inotify_event *) &buffer[ i ]; 

     if (event->len) { 
      if (event->mask & IN_CREATE || IN_MOVED_TO) { 
       printf("The file %s was created.\n", event->name); 

      } 
     } 
    } 
    (void) inotify_rm_watch(fd, wd); 
    (void) close(fd); 

    exit(0); 
} 

ответ

0

Используйте функции FindFirstFile и FindNextFile. Например, показать этот код:

#include <windows.h> 
#include <stdio.h> 
#include <sys/stat.h> 
#include <io.h> 
/* 
HANDLE FindFirstFile 
(
    LPCTSTR lpFileName,  // какой файл ищем, можно указывать маску *, ? 
    LPWIN32_FIND_DATA lpFindFileData // указатель на структуру с информацией 
);*/ 
//В случае ошибке вернет INVALID_HANDLE_VALUE. Для продолжения поиска используется функция: 
/* 
BOOL FindNextFile 
(
    HANDLE hFindFile,   // указатель на поиск 
    LPWIN32_FIND_DATA lpFindFileData // указатель на структуру с информацией 
);*/ 


//Write this any address 
#define DISK "C:\\" 
void main() 
{ 

    WIN32_FIND_DATA FindFileData; 
    HANDLE hf; 
    struct stat st; 

    hf=FindFirstFile(DISK"*", &FindFileData); 

    if (hf!=INVALID_HANDLE_VALUE) 
    { 
     do 
     { 
      char s[MAX_PATH] = DISK; 
      int a; 

      strcat(s, FindFileData.cFileName); 
      stat(s, &st); 
      a = access(s, 04); 
      printf("%s\t\t%s\n", FindFileData.cFileName, st.st_mode & S_IFDIR ? "Directory" : (st.st_mode & S_IFREG ? "File" : "Other")); 
     } 
     while (FindNextFile(hf,&FindFileData)!=0); 
     FindClose(hf); 
    } 

    getchar(); 
} 
+1

Привет, Константин Дедов, спасибо за ответ. Но я ищу что-то подобное этой функции на платформе C на linux. Windows-код мне не поможет. –

0

Чтобы контролировать директорию для создания файла или удаления, вы можете создать inotify экземпляр и монитор с флагами IN_CREATE | IN_DELETE. Чтобы контролировать файл или каталог, сначала создайте экземпляр inotify с inotify_init, который вернет дескриптор файла. Затем вы можете добавить файлы/каталоги для мониторинга с помощью inotify_add_watch и предоставить соответствующие флажки для поиска необходимых изменений. Затем вы можете просто использовать read, который будет блокироваться до тех пор, пока не будут обнаружены изменения, соответствующие вашим критериям.

Простой пример для наблюдения каталога (в качестве ввода в качестве первого аргумента [./tmp по умолчанию]) выглядит следующим образом:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/inotify.h> 

#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define EVENT_BUF_LEN  (1024 * (EVENT_SIZE + 16)) 

int dir_exists (char *d); 

int main (int argc, char **argv) 
{ 
    int length, i = 0; 
    int fd; 
    int wd; 
    char buffer[EVENT_BUF_LEN]; 
    char *path = argc > 1 ? argv[1] : "./tmp"; 

    /* check directory to monitor exists */ 
    if (!dir_exists (path)) { 
     fprintf (stderr, "error: directory does not exist '%s'.\n", path); 
     return 1; 
    } 

    /* create inotify instance & validate */ 
    if ((fd = inotify_init()) < 0) { 
     perror ("inotify_init"); 
    } 

    /* add path to inotify watch list monitor for file create, delete. 
     add IN_MOVED_FROM | IN_MOVED_TO or move to/from directory */ 
    wd = inotify_add_watch (fd, path, IN_CREATE | IN_DELETE); 

    /* monitor path for new file creation or deletion 
     (read blocks until the change event occurs) */ 
    if ((length = read (fd, buffer, EVENT_BUF_LEN)) < 0) { 
     perror ("read"); 
    } 

    /* report name of file created or deleted */ 
    while (i < length) { 
     struct inotify_event *event = (struct inotify_event *) &buffer[i]; 
     if (event->len) { 
      if (event->mask & IN_CREATE) { 
       if (event->mask & IN_ISDIR) { 
        printf ("New directory %s created.\n", event->name); 
       } else { 
        printf ("New file %s created.\n", event->name); 
       } 
      } else if (event->mask & IN_DELETE) { 
       if (event->mask & IN_ISDIR) { 
        printf ("Directory %s deleted.\n", event->name); 
       } else { 
        printf ("File %s deleted.\n", event->name); 
       } 
      } 
     } 
     i += EVENT_SIZE + event->len; 
    } 
    /* remove monitoring of path from the watch list. */ 
    inotify_rm_watch (fd, wd); 

    /* close the inotify instance */ 
    close (fd); 

    return 0; 

} 

/** test that directory exists (>=1 success, 0 otherwise) 
* NOTE: no directory is actually created. fail occurs instead. 
*/ 
int dir_exists (char *d) 
{ 
    int flags = O_DIRECTORY | O_RDONLY; 
    int mode = S_IRUSR | S_IWUSR; 
    int fd = open (d, flags, mode); 

    if (fd < 0)  /* directory does not exist */ 
     return 0; 
    else if (fd) { /* directory exists, rtn fd */ 
     close (fd); 
    } 

    return fd; 
} 

Compile

gcc -Wall -Wextra -o bin/inotify_watch inotify_watch.c 

Пример использования

$ ./bin/inotify_watch & 
[1] 16916 

$ touch tmp/file.txt 
New file file.txt created. 
[1]+ Done     ./bin/inotify_watch