_tmain的_TCHAR*argv只读取到每个参数第一个字母的问题

使用_tmain的话,在ascii环境下会生成

int main(int argc, char* argv[]);

在unicode环境下会生成

int wmain(int argc, wchar_t* argv[]);

所以实际上参数得到的是一个wchar*

它一个字母占用两个字节,代表普通的英文单词和符号只用到了前一个字节,第二个字节其实是空的。当使用cout和print的打印wchar的时候,他遇到第二个字节0,就认为到末尾了,就停止了打印。

要使用wcout代替cout。

或者_tprintf代替printf。

_tprintf也是可以根据实际情况选择调用的函数的

#define _tprintf        wprintf
#define _tprintf        printf


#include <windows.h> #include <stdio.h> #include <tchar.h> #define MAX_BUFFER_SIZE 65536 // 文件变化类型描述 const TCHAR* GetActionDescription(DWORD action) { switch (action) { case FILE_ACTION_ADDED: return _T("添加"); case FILE_ACTION_REMOVED: return _T("删除"); case FILE_ACTION_MODIFIED: return _T("修改"); case FILE_ACTION_RENAMED_OLD_NAME: return _T("重命名(旧名)"); case FILE_ACTION_RENAMED_NEW_NAME: return _T("重命名(新名)"); default: return _T("未知操作"); } } int _tmain(int argc, TCHAR* argv[]) { if (argc != 2) { _tprintf(_T("用法: %s <监控目录>\n"), argv[0]); return 1; } // 1. 打开要监控的目录 HANDLE hDir = CreateFile( argv[1], // 监控目录路径 FILE_LIST_DIRECTORY, // 访问权限:列出目录内容 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // 共享模式 NULL, // 安全属性 OPEN_EXISTING, // 打开现有目录 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // 目录监控专用标志 NULL ); if (hDir == INVALID_HANDLE_VALUE) { _tprintf(_T("无法打开目录。错误: %d\n"), GetLastError()); return 1; } BYTE buffer[MAX_BUFFER_SIZE]; DWORD bytesReturned; FILE_NOTIFY_INFORMATION* pNotifyInfo; TCHAR oldName[MAX_PATH] = {0}; // 用于存储重命名的旧文件名 _tprintf(_T("开始监控目录: %s (按Ctrl+C退出)\n\n"), argv[1]); // 2. 持续监控目录变化 while (TRUE) { ZeroMemory(buffer, sizeof(buffer)); // 3. 读取目录变化 BOOL success = ReadDirectoryChangesW( hDir, // 目录句柄 buffer, // 接收变化的缓冲区 sizeof(buffer), // 缓冲区大小 TRUE, // 监控子目录 FILE_NOTIFY_CHANGE_FILE_NAME | // 监控文件名更改 FILE_NOTIFY_CHANGE_DIR_NAME | // 监控目录名更改 FILE_NOTIFY_CHANGE_ATTRIBUTES | // 监控属性更改 FILE_NOTIFY_CHANGE_SIZE | // 监控文件大小更改 FILE_NOTIFY_CHANGE_LAST_WRITE, // 监控最后写入时间更改 &bytesReturned, // 返回的字节数 NULL, // 同步操作,无需OVERLAPPED NULL // 无需完成例程 ); if (!success) { _tprintf(_T("ReadDirectoryChangesW失败。错误: %d\n"), GetLastError()); break; } // 4. 处理目录变化通知 DWORD offset = 0; do { pNotifyInfo = (FILE_NOTIFY_INFORMATION*)(buffer + offset); // 将宽字符文件名转换为以null结尾的字符串 TCHAR fileName[MAX_PATH]; memcpy(fileName, pNotifyInfo->FileName, pNotifyInfo->FileNameLength); fileName[pNotifyInfo->FileNameLength / sizeof(WCHAR)] = _T('\0'); // 处理重命名事件的特殊逻辑 if (pNotifyInfo->Action == FILE_ACTION_RENAMED_OLD_NAME) { _tcscpy_s(oldName, MAX_PATH, fileName); } else if (pNotifyInfo->Action == FILE_ACTION_RENAMED_NEW_NAME) { _tprintf(_T("[事件] %s: %s -> %s\n"), GetActionDescription(pNotifyInfo->Action), oldName, fileName); } else { _tprintf(_T("[事件] %s: %s\n"), GetActionDescription(pNotifyInfo->Action), fileName); } // 移动到下一个通知 offset += pNotifyInfo->NextEntryOffset; } while (pNotifyInfo->NextEntryOffset != 0); // 直到没有下一个通知 } CloseHandle(hDir); return 0; } 代码原理和执行流程
最新发布
11-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值