如何在WinAPI的OpenFileName对话框中筛选指定字母开头的CSV文件?
WinAPI OPENFILENAME 筛选特定开头CSV文件实现方案
一、实现以“m”开头的CSV文件筛选
要筛选文件名以m开头的CSV文件,只需修改lpstrFilter中的文件掩码为m*.csv即可。同时要确保OPENFILENAME结构体的必要成员正确初始化,避免未定义行为,完整示例代码如下:
OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; // 可替换为你的窗口句柄 ofn.lpstrFile = new WCHAR[MAX_PATH]; ofn.lpstrFile[0] = L'\0'; ofn.nMaxFile = MAX_PATH; // 筛选规则格式:显示名称\0文件掩码\0,最后以双空终止 ofn.lpstrFilter = L"CSV Files starting with m (*.csv)\0m*.csv\0All Files (*.*)\0*.*\0"; ofn.nFilterIndex = 1; // 默认选中第一个筛选规则 ofn.lpstrTitle = L"Select CSV File Starting with 'm'"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn)) { // ofn.lpstrFile 存储了用户选中的文件路径,此处添加业务逻辑 } delete[] ofn.lpstrFile;
核心修改点:将原筛选掩码*.csv替换为m*.csv,对话框就只会展示文件名以m开头且后缀为.csv的文件。
二、代码中\0的作用
lpstrFilter是WinAPI规定的双空终止字符串序列,不同位置的\0作用不同:
- 规则内分隔符:每组筛选规则中,第一个
\0用来分隔“用户可见的显示名称”和“实际生效的文件掩码”,比如L"CSV Files starting with m (*.csv)\0m*.csv"里的\0; - 规则组分隔符:不同筛选规则之间的
\0用来区分多组规则,比如m*.csv\0All Files (*.*)里的\0; - 终止符:最后的
\0标记整个筛选器字符串的结束,告诉WinAPI所有筛选规则已定义完成。
缺少任何一个\0都会导致对话框解析筛选规则出错,必须严格遵循这个格式。
内容的提问来源于stack exchange,提问作者Shahgee
相关产品推荐
相关产品推荐

