遍历指定文件夹下的所有文件和子文件夹,找到指定文件并返回路径

时间:2022-06-11 12:29:09
遍历指定文件夹下的所有文件和子文件夹,找到指定文件,  并返回完整路径。

比如。我要找到 腾讯QQ.lnk 这个快捷方式文件

给出一个路径"C:\Documents and Settings"

则遍历里面所有的文件和文件夹找到 腾讯QQ.lnk 并返回他所在的完整路径"C:\Documents and Settings\Administrator\桌面\腾讯QQ.lnk"


PS:

其实我是想用这个路径来找QQ.exe的安装路径的,只要我有腾讯QQ.lnk的完整路径就行了,但是我不会遍历文件夹,,饿。。

9 个解决方案

#1


CFileFind
http://www.yesky.com/20010704/187879.shtml

#2


CFileFind类FindFile/FileNextFile();

void Recurse(LPCTSTR pstr, CString& strText)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files; otherwise, we'd
// recur infinitely!

if (finder.IsDots())
continue;

// if it's a directory, recursively search it
CString str = finder.GetFilePath();
if (finder.IsDirectory())
{
Recurse(str, strText);
}
else
{
strText += str + _T("\r\n");
}
}

finder.Close();
}


// 调用
CString strText(_T(""));
Recurse(_T("F:\\MyProjects"), strText);
AfxMessageBox(strText);

#3



void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (bIsFinded) 
    { 
        bIsFinded = fileFinder.FindNextFile(); 

        if(!fileFinder.IsDots()) 
        {
            strTemp    = fileFinder.GetFilePath();
            if(fileFinder.IsDirectory())
                FindFile(strTemp);
            else
            {
                if(!strcmp(strTemp.Right(strTemp.GetLength()-strTemp.ReverseFind('\\')-1),"腾讯QQ.lnk"))
                   m_strFilesSrc.Add(strTemp);
            }
        }
    } 
    fileFinder.Close();
}



记得在头文件中定义:
CStringArray m_strFilesSrc;

查找的时候:
FindFile("C:\\Documents and Settings");

m_strFilesSrc数组里面存放的就是C:\Documents and Settings文件夹下所有的快捷方式名为“腾讯QQ.lnk”的文件路径

#4


两个API 
FindFirstFile
FindNextFile
关闭查找到的文件句柄要用FindClose而不是CloseHandle

#5


引用 3 楼 king_hhuang 的回复:
C/C++ code

void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (……


哥哥这个数组怎么用啊,,怎么输出呢?
我用printf("%s",m_strFilesSrc)输出的是乱码。。。

我得到这个路径后要传给这个参数LPWSTR lpwLnkFile,好像类型也不匹配啊。。。我真的不太懂。。多帮下

#6


帮帮忙啊~~~~~~

#7


for(int i=0; i<m_strFilesSrc.GetSize(); i++)
{
AfxMessageBox(m_strFilesSrc[i]);
}

#8


没有注意细节啊你??  C:\Documents and Settings\Administrator\桌面\腾讯QQ.lnk"
开始你给出 C:\Documents and Settings
然后你应该在 C:\\Documents and Settings\\*.* 下搜索  如果搜不到 那么就要得到其下的文件夹路径
比如C:\Documents and Settings\Administrator\
之后你应该在C:\Documents and Settings\Administrator\这个CString中 把它补成C:\\Documents and Settings\\Administrator\\*.*继续搜索
重复、、、、
关键是得到路径后 要补成搜索时的合法路径

#9


引用 3 楼 king_hhuang 的回复:
C/C++ code

void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (……


大神。。这里还有个帖子。问题是一样的
http://topic.csdn.net/u/20110513/06/8a12bf39-a504-40b5-a1de-92e91179cf36.html
麻烦回复下。我把分给你。




好人做到底  送佛送到西
看看这个帖子。。
http://topic.csdn.net/u/20110514/01/36b97fea-2d11-42ff-a76c-52297b28b11a.html

我已经很努力的用最简洁的语言说明问题
并且已经把版面排好了,不会看着头昏的。麻烦抽空看下。
上面代码遗留下来的问题。希望能解决。。谢谢!

#1


CFileFind
http://www.yesky.com/20010704/187879.shtml

#2


CFileFind类FindFile/FileNextFile();

void Recurse(LPCTSTR pstr, CString& strText)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files; otherwise, we'd
// recur infinitely!

if (finder.IsDots())
continue;

// if it's a directory, recursively search it
CString str = finder.GetFilePath();
if (finder.IsDirectory())
{
Recurse(str, strText);
}
else
{
strText += str + _T("\r\n");
}
}

finder.Close();
}


// 调用
CString strText(_T(""));
Recurse(_T("F:\\MyProjects"), strText);
AfxMessageBox(strText);

#3



void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (bIsFinded) 
    { 
        bIsFinded = fileFinder.FindNextFile(); 

        if(!fileFinder.IsDots()) 
        {
            strTemp    = fileFinder.GetFilePath();
            if(fileFinder.IsDirectory())
                FindFile(strTemp);
            else
            {
                if(!strcmp(strTemp.Right(strTemp.GetLength()-strTemp.ReverseFind('\\')-1),"腾讯QQ.lnk"))
                   m_strFilesSrc.Add(strTemp);
            }
        }
    } 
    fileFinder.Close();
}



记得在头文件中定义:
CStringArray m_strFilesSrc;

查找的时候:
FindFile("C:\\Documents and Settings");

m_strFilesSrc数组里面存放的就是C:\Documents and Settings文件夹下所有的快捷方式名为“腾讯QQ.lnk”的文件路径

#4


两个API 
FindFirstFile
FindNextFile
关闭查找到的文件句柄要用FindClose而不是CloseHandle

#5


引用 3 楼 king_hhuang 的回复:
C/C++ code

void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (……


哥哥这个数组怎么用啊,,怎么输出呢?
我用printf("%s",m_strFilesSrc)输出的是乱码。。。

我得到这个路径后要传给这个参数LPWSTR lpwLnkFile,好像类型也不匹配啊。。。我真的不太懂。。多帮下

#6


帮帮忙啊~~~~~~

#7


for(int i=0; i<m_strFilesSrc.GetSize(); i++)
{
AfxMessageBox(m_strFilesSrc[i]);
}

#8


没有注意细节啊你??  C:\Documents and Settings\Administrator\桌面\腾讯QQ.lnk"
开始你给出 C:\Documents and Settings
然后你应该在 C:\\Documents and Settings\\*.* 下搜索  如果搜不到 那么就要得到其下的文件夹路径
比如C:\Documents and Settings\Administrator\
之后你应该在C:\Documents and Settings\Administrator\这个CString中 把它补成C:\\Documents and Settings\\Administrator\\*.*继续搜索
重复、、、、
关键是得到路径后 要补成搜索时的合法路径

#9


引用 3 楼 king_hhuang 的回复:
C/C++ code

void FindFile(CString strPath)
{
    CString            strTemp;
    CFileFind        fileFinder;

    BOOL    bIsFinded    = fileFinder.FindFile(strPath+_T("\\*.*")); 
    while (……


大神。。这里还有个帖子。问题是一样的
http://topic.csdn.net/u/20110513/06/8a12bf39-a504-40b5-a1de-92e91179cf36.html
麻烦回复下。我把分给你。




好人做到底  送佛送到西
看看这个帖子。。
http://topic.csdn.net/u/20110514/01/36b97fea-2d11-42ff-a76c-52297b28b11a.html

我已经很努力的用最简洁的语言说明问题
并且已经把版面排好了,不会看着头昏的。麻烦抽空看下。
上面代码遗留下来的问题。希望能解决。。谢谢!