windows c语言监听某个目录下的文件的新增并且不用windows api的代码
时间: 2024-02-19 14:02:39 浏览: 99
类似于上一个问题的解决方案,我们可以使用定时器定期检查目录下的文件状态,并比较上一次检查时的状态。如果发现有新文件出现,则说明有文件新增。以下是一种实现方式:
```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++;
printf("%s added\n", file_path);
}
}
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;
}
```
该代码与上一个问题的代码类似,唯一的差别在于判断文件是否新增的方式。如果发现一个文件不在`g_files`数组中,则说明该文件是新增的,此时输出相应信息。该代码同样没有考虑目录结构、子目录等因素,仅供参考。
阅读全文