2012-02-01 73 views
1

我在Ubuntu工作。我想監視一個文件夾並打印在子文件夾(打印文件)中彈出的每個事件。 我有下面的代碼,但它不起作用。執行時,沒有事件的打印。程序,反應並記錄事件

在第二個代碼中,我只能看到文件夾中的事件。來自每個子文件夾的事件不會彈出。

#include <string> 
#include <iostream> 
#include <stdio.h> 
using namespace std; 
std::string exec(char* cmd) { 
    FILE* pipe = popen(cmd, "r"); 
    if (!pipe) return "ERROR"; 
    char buffer[256]; 
    std::string result = ""; 
    while(!feof(pipe)) { 
     if(fgets(buffer, 256, pipe) != NULL) 
       result += buffer; 
    } 
    pclose(pipe); 
    cout<<"result is: "<<result<<endl; 
    return result; 
} 

int main() 
{ 
    //while(1) 
    //{ 
    string s=exec((char*)"inotifywait -rme create /home/folder/"); 

    cout << s << endl; 
    //} 
    return 0; 
} 

此代碼僅打印我正在監視的文件夾中的事件。它不會打印每個子文件夾中的事件。我不知道如何改善它以滿足我的需求。

#include <sys/inotify.h> 
#include <sys/ioctl.h> 
#include <iostream> 

void processNewFiles(int fd, int wd); 


int main(int argc, char** argv) 
{ 
    const char* dirPath = "/home/folder/" ;//argv[1]; 

    int fd = inotify_init(); 
    int wd = inotify_add_watch(fd, dirPath, IN_CREATE); 

    if (wd) 
    { 
     processNewFiles(fd, wd); 

     inotify_rm_watch(fd, wd); 
    } 
} 


void processNewFiles(int fd, int wd) 
{ 
    bool done = false; 

    do 
    { 
     int qLen = 0; 

     ioctl(fd, FIONREAD, &qLen); 

     char* buf = new char[qLen]; 
     int num = read(fd, buf, qLen); 

     if (num == qLen) 
     { 
     inotify_event* iev = reinterpret_cast<inotify_event*>(buf); 

     if (iev->wd == wd && iev->mask & IN_CREATE) 
     { 
      std::cout << "New file created: " << iev->name << std::endl; 
     } 
     } 

     delete [] buf; 
    } while (!done); 
} 
+1

*什麼*不起作用? – Xeo 2012-02-01 16:07:41

+0

我正在執行g ++代碼。字符串s沒有輸出。 – 2012-02-01 16:08:25

回答

1

您的第二個解決方案不起作用,因爲inotify_add_watch不能正常工作。您將不得不手動添加手錶的子目錄。因爲這可能很煩人,所以也可以像在第一個示例中那樣使用實用程序inotifywait。

你的第一個例子不起作用,因爲你永遠在讀管道。如果你殺死了inotifywait進程(例如,如果你是機器上唯一的人,並且這是唯一使用「killall inotifywait」的inotifywait進程),你將得到你的輸出,因爲你會跳出循環讀取管道。如果你在循環內輸出一些東西,它也會起作用。

相關問題