➣ Reading Time: 10 minutes

基礎概念

inotify 是取用 linux 底下的系統自動監聽檔案變化的方式,
在 C++ 中,當我們獲得了系統給的 event,我們會得到該檔案的「檔名」,
我們就能再進一步依照此絕對路徑做對應的資料操作。

注意:inotify 的功能目前只在 linux 系統能使用,mac 上不能使用哦~ (自己親自測試過QQ)

使用範例

inotify 做到的效果就是:如果當某個資料夾底下有資料變化,會告訴你「檔名」
舉一些例子例如:
– 新增:IN_CREATE
– 修改:IN_MODIFY
– 刪除:IN_DELETE
– 資料被開啟:IN_OPEN
– 資料屬性變化:IN_ATTRIB (可搭配touch使用,獲得目標檔案路徑)

Sample Code

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <unistd.h>
#include <iostream>
#include <cxxabi.h>
#include <typeinfo>

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

using namespace std;

template<typename T>
const std::string get_type_name(const T variable) {
    const char* const name = typeid(variable).name();
    int status = -4;
    char* const demangled_name = abi::__cxa_demangle(name, NULL, NULL, &status);
    std::string ret{name};
    if (status == 0) {
        ret = std::string(demangled_name);
        free(demangled_name);
    }
    return ret;
}

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, "/mnt/ramdisk/", IN_MODIFY | IN_CREATE | IN_DELETE | IN_ATTRIB);
    length = read(fd, buffer, BUF_LEN);

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

    while (i < length) {
        struct inotify_event *event =
            (struct inotify_event *) &buffer[i];

        cout << event << endl;

        if (event->len) {
            if (event->mask & IN_CREATE) {
                cout << event->name << endl;
                printf("The file %s was created.\n", event->name);
            } else if (event->mask & IN_DELETE) {
                cout << event->name << endl;
                printf("The file %s was deleted.\n", event->name);
            } else if (event->mask & IN_MODIFY) {
                cout << event->name << endl;
                printf("The file %s was modified.\n", event->name);
            }
              else if (event->mask & IN_ATTRIB) {
                cout << event->name << endl;
                cout << typeid(event->name).name()<< endl;
                cout << get_type_name(event->name) << endl;
                printf("The file %s was IN_ATTRIB.\n", event->name);  
            }
        }
        i += EVENT_SIZE + event->len;
    }

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

    return 0;
}

Reference

https://stackoverflow.com/questions/13351172/inotify-file-in-c

 ⭐C++ 基礎用法 相關文章整理⭐:
1.【C++】C++ compile 程式碼 使用 c++ 11 與使用相關的 package
2.【C++】C/C++ 顯示資料的類別 (type) sample code (內含範例程式碼) print C data type, cout C++ data type, get variable type in c++
3.【C++】C++ 複製 2D array的方法 copy 2d array memcpy sample code (內含範例程式碼)
⭐C++ 字串處理相關文章整理⭐:
1.【C++】字串 char string stringstream 相關用法總整理 (內含範例程式碼)
2.【C++】C++ String 用法 連接兩個 String c++ string concat
⭐C++ 系統偵測相關文章整理⭐:
1.【C++】C++ 利用 dirent.h 計算資料夾的檔案數量 count files sample code (內含範例程式碼)
2.【C++】C++ inotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
⭐C++ OpenCV 相關文章整理⭐:
1.【OpenCV】c++ OpenCV - 在 ubuntu 上第一次執行 OpenCV 程式 sample code (內含範例程式碼)
2.【OpenCV】c++ OpenCV - 在圖片上寫上文字 cv::putText sample code (內含範例程式碼)
3.【OpenCV】c++ OpenCV - cv::Rect 矩形用法與相關功能函數 sample code (內含範例程式碼)
4.【OpenCV】c++ OpenCV - OpenCV 中的純量 定義顏色 cv::Scalar(255,255,255) color sample code (內含範例程式碼)