3.3.7 具体实现(6)
函数FindFirstFile()可以在指定盘符下查找文件,并将获取到的文件数据保存到缓冲区中,该函数返回文件查找操作的句柄。参数lpFileName表示用户需要查找的文件名。如果该名称中没有包含路径,则程序会在当前目录下来查找文件,否则在指定路径下查找文件。在文件名中可以使用"*"等通配符代替,代码如下:
- lpFileName = "C:\\windows\\*.*"; //在C:\\windows\\下查找所有文件
- lpFileName = "C:\\windows\\*.txt"; //在目录C:\\windows\\下查找所有TXT文件
- lpFileName = "C:\\windows\\vtk.bin"; //在目录C:\\windows\\下查找文件vtk.bin
- lpFileName = "C:\\windows\\*.exe"; //在目录C:\\windows\\下查找所有EXE文件
函数FindNextFile()可以继续查找其他格式的文件的操作。参数hFindFile表示函数FindFirstFile()返回的操作句柄。参数lpFindFileData指向结构体WIN32_FIND_DATA,保存了程序所找到的文件名和文件属性等数据。该函数调用成功返回True,否则返回False。WIN32_FIND_DATA的结构如下:- typedef struct _WIN32_FIND_DATA {
- DWORD dwFileAttributes; //文件属性
- FILETIME ftCreationTime; //文件创建日期
- FILETIME ftLastAccessTime; //文件最后保存日期
- FILETIME ftLastWriteTime; //文件最后修改日期
- DWORD nFileSizeHigh; //文件长度的高32位
- DWORD nFileSizeLow; //文件长度的低32位
- DWORD dwReserved0; //保留
- DWORD dwReserved1; //保留
- TCHAR cFileName[MAX-PATH]; //本次查找到的文件名
- TCHAR cAlternateFileName[14]; //文件的短文件名
- } WIN32_FIND_DATA;
参数cAlternateFileName[14]为文件的短文件名。例如文件路径为C:\\windows\\vtk.bin的文件短名称为vtk.bin。
当在客户端启动时,可以使用上面两个函数进行文件的查找。其代码如下:
- BOOL CFTPDlg::OnInitDialog()
- {
- ... //省略部分代码
- int i = 0;
- LVITEM item = {0}; //初始化列表结构
- item.mask = LVIF_TEXT; //指定pszText域有效
- WIN32_FIND_DATA filedata = {0}; //初始化结构体WIN32_FIND_DATA
- HANDLE filehand; //文件句柄
- filehand = ::FindFirstFile("C:\\*", &filedata); //查找C盘下所有文件
- while(::FindNextFile(filehand, &filedata))
- {
- item.pszText = (LPTSTR)filedata.cFileName; //将文件名称赋给列表项
- this->GetDlgItem(IDC_LIST1)->
- InsertColumn(i, &item); //在列表中插入栏目名称
- i += 1;
- }
- return TRUE;
- }
除了上述获取文件的方式以外,还可以通过用户选择的特定盘符进行获取。其中,响应用户选择的函数是CFTPDlg::OnSelchangeCombo1(),具体代码如下:- void CFTPDlg::OnSelchangeCombo1() //组合框选择消息响应
- {
- CString str; //定义字符串变量
- int i = m_c1.GetCurSel(); //获取用户单击位置的索引
- m_c1.GetLBText(i, str); //获取索引处的字符
- str += " * "; //添加通配符"*"
- WIN32_FIND_DATA filedata = {0}; //初始化结构体WIN32_FIND_DATA
- HANDLE filehand; //文件句柄
- filehand = ::FindFirstFile(str, &filedata); //查找特定盘下所有文件
- while(::FindNextFile(filehand, &filedata))
- {
- item.pszText = (LPTSTR)filedata.cFileName; //将文件名称赋给列表项
- this->GetDlgItem(IDC_LIST1)->
- insertColumn(i, &item); //在列表中插入栏目名称
- i += 1;
- }
- }