我在Ubuntu工作。我想监视一个文件夹并打印子文件夹中弹出的每个事件(打印文件)。 我有以下代码但它不起作用。执行时,没有事件的println。
在第二个代码中,我只看到文件夹中的事件。每个子文件夹中的事件都不会弹出。
#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);
}
答案 0 :(得分:1)
您的第二个解决方案不起作用,因为inotify_add_watch无法递归工作。您必须手动为子目录添加监视。由于这可能很烦人,也可以像在第一个例子中一样使用实用程序inotifywait。
你的第一个例子没有用,因为你永远在读管道。如果你杀死inotifywait进程(例如,如果你是机器上唯一的人,并且这是唯一使用“killall inotifywait”的inotifywait进程),你将得到你的输出,因为你将从管道中取出循环读数。如果你在循环中输出一些东西,它也会起作用。