⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_29597.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:29597 发表者:峰凛 发表日期:2003-02-10 13:50:37
<br>主题:急请高手指教!
<br>内容:请问怎样才能在我的电脑中查找指定文件名的文件,就想windows操作系统的查找功能一样<BR>,那里有这样的程序可以下载啊,谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:bird 回复日期:2003-02-10 13:52:48
<br>内容:一种方法:<BR><BR><BR>用系统查找功能来查找指定文件:<BR>ShellExecute(m_hWnd,"find","d:\\nish",NULL,NULL,SW_SHOW);<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:bird 回复日期:2003-02-10 13:54:53
<br>内容:一种方法:<BR><BR>MFC中有一个专门用来进行文件查找的类CFileFind,使用它可以方便快捷地进行文件的查找。<BR><BR>  CString strFileTitle;<BR><BR>  CFileFind finder;<BR><BR>  BOOL bWorking = finder.FindFile("C:\\windows\\sysbkup\\*.cab");<BR><BR>  while(bWorking)<BR><BR>  {<BR><BR>  bWorking=finder.FindNextFile();<BR><BR>  strFileTitle=finder.GetFileTitle();<BR><BR>  }
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:bird 回复日期:2003-02-10 13:57:03
<br>内容:闻老大的文章--你看过了吗??<BR><BR>Win32中提供了专门的文件查找的函数, <BR><BR>HANDLE FindFirstFile(<BR>&nbsp;&nbsp;LPCTSTR lpFileName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // file name<BR>&nbsp;&nbsp;LPWIN32_FIND_DATA lpFindFileData&nbsp;&nbsp;// data buffer<BR>);<BR>BOOL FindNextFile(<BR>&nbsp;&nbsp;HANDLE hFindFile,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// search handle <BR>&nbsp;&nbsp;LPWIN32_FIND_DATA lpFindFileData // data buffer<BR>);<BR>BOOL FindClose(<BR>&nbsp;&nbsp;HANDLE hFindFile&nbsp;&nbsp; // file search handle<BR>);<BR><BR>在开始文件查找时先调用FindFirstFile,同时提供一个需要查找的文件名,该文件名中可以有通配符号* ?,而lpFindFileData是作为输出参数,该参数的具体内容后面再讲。如果查找失败将返回 INVALID_HANDLE_VALUE,如果查找成功函数将返回一个句柄,并且有系统填充lpFindFileData参数所指向的结构。在第一次查找成功后利用返回的句柄和lpFindFileData参数来调用FindNextFile,如果能够找到下一个匹配的文件函数会返回TRUE,否则返回FALSE。在查找结束后调用FindClose关闭句柄。示范代码如下: <BR>WIN32_FIND_DATA ffd ;<BR>HANDLE hFind = FindFirstFile("c:\\windows\\*.txt",&amp;ffd);<BR>if (hFind != INVALID_HANDLE_VALUE)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;//处理第一个找到的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(FindNextFile(hFind,&amp;ffd))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//your code ... 处理其他被找到的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;FindClose(hFind);<BR>}<BR><BR>在文件查找中核心部分就是 WIN32_FIND_DATA 结构,在使用这个结构时请记住不要手工修改这个结构中的任何数据,结构对于开发人员来将只能作为一个只读数据,所有字段都会由系统填写,结构内容如下: <BR>typedef struct _WIN32_FIND_DATA {<BR>&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwFileAttributes; //文件属性<BR>&nbsp;&nbsp;FILETIME ftCreationTime; // 文件创建时间<BR>&nbsp;&nbsp;FILETIME ftLastAccessTime; // 文件最后一次访问时间<BR>&nbsp;&nbsp;FILETIME ftLastWriteTime; // 文件最后一次修改时间<BR>&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;nFileSizeHigh; // 文件长度高32位<BR>&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;nFileSizeLow; // 文件长度低32位<BR>&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwReserved0; // 系统保留<BR>&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwReserved1; // 系统保留<BR>&nbsp;&nbsp;TCHAR&nbsp;&nbsp;&nbsp;&nbsp;cFileName[ MAX_PATH ]; // 长文件名<BR>&nbsp;&nbsp;TCHAR&nbsp;&nbsp;&nbsp;&nbsp;cAlternateFileName[ 14 ]; // 8.3格式文件名<BR>} WIN32_FIND_DATA, *PWIN32_FIND_DATA; <BR><BR>dwFileAttributesw为文件属性,可以是以下数据的按位组合。 <BR>FILE_ATTRIBUTE_ARCHIVE 归档文件或目录 <BR>FILE_ATTRIBUTE_COMPRESSED 压缩文件或目录 <BR>FILE_ATTRIBUTE_DIRECTORY 目录 <BR>FILE_ATTRIBUTE_ENCRYPTED 加密文件或目录 <BR>FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录 <BR>FILE_ATTRIBUTE_NORMAL 文件或目录的属性没有被设置,这个属性只能单独出现 <BR>FILE_ATTRIBUTE_READONLY 只读文件或目录 <BR>FILE_ATTRIBUTE_SYSTEM 系统文件或目录 <BR>FILE_ATTRIBUTE_TEMPORARY 临时文件或目录 <BR>Win32提供的文件查找功能无法对子目录进行嵌套查找,而只能对你指定的目录进行查找,如果希望查找子目录下所有文件则需要自己开发子目录查找功能。例如下面的代码可以遍历指定目录下的所有目录,相当与命令 dir c:\ /D /S <BR><BR>//调用方式 Dir_A_S("c:\\");<BR>void Dir_A_S(LPCSTR pszDir)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",pszDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;WIN32_FIND_DATA ffd ;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char szDirFile[1024];<BR>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szDirFile,"%s*",pszDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hFind = FindFirstFile(szDirFile,&amp;ffd);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (hFind != INVALID_HANDLE_VALUE)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szDir[1024];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ffd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcmp(ffd.cFileName,".") &amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcmp(ffd.cFileName,".."))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//确定找到一个目录并且不为 . 或 ..<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dir_A_S(szDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(FindNextFile(hFind,&amp;ffd))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ffd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcmp(ffd.cFileName,".") &amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcmp(ffd.cFileName,".."))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//确定找到一个目录并且不为 . 或 ..<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szDir,"%s%s\\",pszDir,ffd.cFileName);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf("%s\n",szDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dir_A_S(szDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindClose(hFind);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR>文件查找还有一个其他的用法就是用来确定文件是否存在,你可以使用下面的函数。 <BR><BR>BOOL IsFileExist(LPCSTR pszFileName)<BR>{<BR>&nbsp;&nbsp;WIN32_FIND_DATA FindFileData;<BR>&nbsp;&nbsp;HANDLE hFind;<BR><BR>&nbsp;&nbsp;hFind = FindFirstFile(pszFileName, &amp;FindFileData);<BR><BR>&nbsp;&nbsp;if (hFind == INVALID_HANDLE_VALUE) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindClose(hFind);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;}<BR>}<BR><BR>如果你使用MFC进行开发,可以使用CFileFind类来进行文件查找,MFC完整的封装了文件查找的功能。用于文件查找的成员函数为: <BR><BR>virtual BOOL FindFile( LPCTSTR pstrName = NULL, DWORD dwUnused = 0 ); 开始查询<BR>virtual BOOL FindNextFile( ); 查找文件,对于第一个文件和下一个文件都通过这个函数进行查询<BR>//下面是一段文件查找演示代码<BR>&nbsp;&nbsp; CFileFind finder;<BR>&nbsp;&nbsp; strWildcard += _T("\\*.*");<BR>&nbsp;&nbsp; BOOL bWorking = finder.FindFile(strWildcard);<BR>&nbsp;&nbsp; while (bWorking)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bWorking = finder.FindNextFile();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//你自己的处理代码<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; finder.Close();<BR><BR>同时在CFileFind中封装了很多判断函数用于确定文件的各种属性,这些函数是<BR>GetLength 得到文件长度<BR>GetFileName 得到文件名<BR>GetFilePath 得到文件路径名和文件名<BR>GetCreationTime \ GetLastAccessTime \ GetLastWriteTime 得到文件时间<BR>IsDots 判断文件是否为 . 或 ..<BR>IsReadOnly \ IsDirectory \ IsCompressed \ IsSystem \ IsHidden \ IsTemporary \ IsNormal \IsArchived 得到文件属性<BR><BR>//下面是一个用MFC中CFileFind类实现的目录遍历功能<BR>// 调用方式为 MFC_Dir_A_S("c:\\")<BR>void MFC_Dir_A_S(LPCSTR pszDir)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",pszDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CFileFind ff;<BR>&nbsp;&nbsp;&nbsp;&nbsp;char szDirFile[1024];<BR>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szDirFile,"%s*",pszDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (ff.FindFile(szDirFile))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char szDir[1024];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ff.FindNextFile())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ff.IsDirectory() &amp;&amp; ! ff.IsDots())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//确定找到一个目录并且不为 . 或 ..<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(szDir,"%s%s\\",pszDir,ff.GetFileName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf("%s\n",szDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MFC_Dir_A_S(szDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ff.Close();//关闭<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:峰凛 回复日期:2003-02-10 14:06:03
<br>内容:多谢bird,非常感谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:bird 回复日期:2003-02-10 14:30:21
<br>内容:不用谢,一起学习进步吧!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -