windows C语言实现某个目录下有新文件产生时,打印该文件的内容
时间: 2024-02-18 08:01:53 浏览: 91
要实现这个功能,你需要使用 Windows API 来监控文件系统的变化。具体步骤如下:
1. 使用 FindFirstChangeNotification 函数创建一个句柄,用于监控目录的变化。
2. 使用 ReadDirectoryChangesW 函数读取变化的信息,可以得到新生成的文件名。
3. 使用 CreateFile 函数打开该文件,并读取文件内容。
4. 打印文件内容。
以下是示例代码:
```c
#include <stdio.h>
#include <windows.h>
void monitorDirectoryChanges(const char* path) {
HANDLE dirHandle = FindFirstChangeNotification(path, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);
if (dirHandle == INVALID_HANDLE_VALUE) {
printf("Failed to monitor directory changes\n");
return;
}
while (TRUE) {
if (FindNextChangeNotification(dirHandle) == FALSE) {
printf("Failed to find next change notification\n");
break;
}
DWORD bytesReturned = 0;
char buffer[1024];
if (ReadDirectoryChangesW(dirHandle, buffer, sizeof(buffer), TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE, &bytesReturned, NULL, NULL) == FALSE) {
printf("Failed to read directory changes\n");
break;
}
PFILE_NOTIFY_INFORMATION fileInfo = (PFILE_NOTIFY_INFORMATION) buffer;
while (fileInfo != NULL) {
// Get the file name
WCHAR fileName[1024];
memcpy(fileName, fileInfo->FileName, fileInfo->FileNameLength);
fileName[fileInfo->FileNameLength / 2] = L'\0';
// Open the file and read its contents
char filePath[1024];
sprintf(filePath, "%s\\%S", path, fileName);
HANDLE fileHandle = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileHandle == INVALID_HANDLE_VALUE) {
printf("Failed to open file %s\n", filePath);
} else {
DWORD fileSize = GetFileSize(fileHandle, NULL);
char* fileContents = (char*) malloc(fileSize + 1);
if (fileContents == NULL) {
printf("Failed to allocate memory for file contents\n");
} else {
if (ReadFile(fileHandle, fileContents, fileSize, NULL, NULL) == FALSE) {
printf("Failed to read file %s\n", filePath);
} else {
fileContents[fileSize] = '\0';
printf("File contents of %s:\n%s\n", filePath, fileContents);
}
free(fileContents);
}
CloseHandle(fileHandle);
}
fileInfo = fileInfo->NextEntryOffset != 0 ? (PFILE_NOTIFY_INFORMATION) ((LPBYTE) fileInfo + fileInfo->NextEntryOffset) : NULL;
}
}
FindCloseChangeNotification(dirHandle);
}
int main() {
monitorDirectoryChanges("C:\\test");
return 0;
}
```
注意,这里只监控了目录下最后写入的文件变化,如果需要监控其他类型的变化,需要修改 `FILE_NOTIFY_CHANGE_LAST_WRITE` 参数。同时,由于是在 Windows 平台下实现的,所以代码中使用了 Windows API。
阅读全文