有没有办法实现程序在电脑中搜索指定名称文件的功能?

qq_38405231 2019-05-16 07:54:56
在未知文件路径的情况下。
...全文
241 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2019-05-30
  • 打赏
  • 举报
回复
最普通的速度最慢的方法就是遍历所有磁盘中所有文件. 快一点的办法就是复用ntfs的文件索引, 类似everyting搜索全盘
赵4老师 2019-05-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
using namespace std;
struct {
   UINT type;           LPCSTR name;
} DriveTypeFlags [] = {// GetDriveType返回码与人可读字符串对照表
   {DRIVE_UNKNOWN     ,"未知"        },
   {DRIVE_NO_ROOT_DIR ,"无效路经"    },
   {DRIVE_REMOVABLE   ,"可移动"      },
   {DRIVE_FIXED       ,"固定"        },
   {DRIVE_REMOTE      ,"网络驱动器"  },
   {DRIVE_CDROM       ,"CD-ROM"      },
   {DRIVE_RAMDISK     ,"随机存取磁盘"},
   {0                 , NULL         },
};
int _tmain() {
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
        cerr << _T("Fatal Error: MFC initialization failed") << endl;
        return -1;
    }

   // 获取逻辑驱动器字符串- a:\<null>b:\<null>c:\<null>...z:\<null><null>
   // 还可以用GetLogicalDrives以位图形式代替字符串形式获取信息
    TCHAR buf[200];
    DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);

    string msg = "逻辑驱动器:\n";
    for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) {
        LPCTSTR sDrivePath = s;
        msg += sDrivePath;
        msg += " ";
        UINT uDriveType = GetDriveType(sDrivePath);
        for (int i=0; DriveTypeFlags[i].name; i++) {
            if (uDriveType == DriveTypeFlags[i].type) {
                msg += DriveTypeFlags[i].name;
                break;//
            }
        }
        msg += '\n';
    }
    cout << msg.c_str();
    return 0;
}
Eleven 2019-05-17
  • 打赏
  • 举报
回复
CFileFind::FindFirstFile/FileNextFile()
schlafenhamster 2019-05-17
  • 打赏
  • 举报
回复
未知文件路径 搜索 根目录

void find(LPCTSTR lpPath,vector<FileInfo>& FileList)
{
string szFind(lpPath);
WIN32_FIND_DATA FindFileData;
szFind+=_T("\\*.*");
HANDLE hFind=::FindFirstFile(szFind.c_str(),&FindFileData);
if(INVALID_HANDLE_VALUE==hFind) return;
//
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{// dir
if(FindFileData.cFileName[0] != '.')
{
string szPath(lpPath);
szPath+=_T("\\");
szPath+=FindFileData.cFileName;
//TRACE1("%s\n",szPath.c_str());
find(szPath.c_str(),FileList);
}
}
else
{// file
string strFileName=FindFileData.cFileName;//文件名
//TRACE1("%s\n",strFileName.c_str());
int at = strFileName.find_last_of('.');
if(at<0) continue;// file without extention
string ext=strFileName.substr(at);
//TRACE1("%s\n",ext.c_str());
//
at=0;// reset
while(((int)at=suffixStr.find(ext,at))>=0)// find type
// if(stricmp(suffixStr.c_str(),_T(".txt"))==0)
{// not suffixStr.c_str()==_T(".txt") ; never == !
//afxDump << at << "\n";
at+=ext.size();// move to seperetor '.'
if(suffixStr[at] != '.') continue;// not wanted !
//
FILETIME ft=FindFileData.ftCreationTime;
SYSTEMTIME st={0};
TCHAR buf[64]={0};
FileTimeToLocalFileTime(&(FindFileData.ftCreationTime),&ft);
FileTimeToSystemTime(&ft,&st);
sprintf(buf,_T("%4d年%02d月%02d日%02d:%02d:%02d"),
st.wYear,st.wMonth,st.wDay,st.wHour/*北京时间*/,st.wMinute,st.wSecond);
string strFilePath=lpPath;
FileInfo fi;
fi.szFileName=strFileName;
fi.szFilePath=strFilePath;
fi.szCreateTime=buf;
//TRACE1("%s\n",strFileName.c_str());
FileList.push_back(fi);
}
}
} while (::FindNextFile (hFind, &FindFileData));
}
zgl7903 2019-05-16
  • 打赏
  • 举报
回复
参考 CFileFind
CFileFind finder;
BOOL bWorking = finder.FindFile(_T("*.*"));
while (bWorking)
{
   bWorking = finder.FindNextFile();
   TRACE(_T("%s\n"), (LPCTSTR)finder.GetFileName());
}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧