windows c语言监听某个目录下的文件变化并且不用windows api的代码
时间: 2024-02-19 20:02:32 浏览: 201
如前所述,如果不使用Windows API,则可以使用定时器来定期检查目录下的文件状态。以下是一种实现方式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <time.h>
#define MAX_PATH 260
#define MAX_FILE_NUM 1024
typedef struct file_info {
char name[MAX_PATH];
time_t mtime;
} file_info_t;
file_info_t g_files[MAX_FILE_NUM];
int g_file_num = 0;
void check_files(const char *dir) {
DIR *dp = opendir(dir);
if (dp == NULL) {
fprintf(stderr, "opendir failed: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
struct dirent *entry = NULL;
while ((entry = readdir(dp)) != NULL) {
if (entry->d_name[0] == '.') {
continue;
}
char file_path[MAX_PATH];
snprintf(file_path, sizeof(file_path), "%s/%s", dir, entry->d_name);
struct stat file_stat;
if (stat(file_path, &file_stat) != 0) {
fprintf(stderr, "stat failed: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
int i;
for (i = 0; i < g_file_num; i++) {
if (strcmp(g_files[i].name, file_path) == 0) {
if (g_files[i].mtime != file_stat.st_mtime) {
printf("%s modified\n", file_path);
g_files[i].mtime = file_stat.st_mtime;
}
break;
}
}
if (i == g_file_num) {
if (g_file_num == MAX_FILE_NUM) {
fprintf(stderr, "too many files\n");
exit(EXIT_FAILURE);
}
strcpy(g_files[g_file_num].name, file_path);
g_files[g_file_num].mtime = file_stat.st_mtime;
g_file_num++;
}
}
closedir(dp);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s dir\n", argv[0]);
exit(EXIT_FAILURE);
}
while (1) {
check_files(argv[1]);
sleep(1);
}
return 0;
}
```
该代码使用了POSIX标准库的函数,可以在类UNIX操作系统(如Linux、macOS等)上编译运行。代码中使用了一个全局数组`g_files`来记录目录下文件的信息,每隔1秒钟调用`check_files`函数检查目录下文件的状态,如果发现文件状态发生变化,则输出相应信息。该代码的功能比较简单,没有考虑目录结构、子目录等因素,仅供参考。
阅读全文