排除搜索文件

时间:2016-06-13 07:51:28

标签: c++

我有一些代码可以搜索所有驱动器以查找所有txt扩展名,但我的问题是,我想在系统驱动器中排除 Windows 文件夹,我测试了很多情况但它没有工作,我的代码是:

#include <windows.h>
#include <tchar.h> 
#include <stdio.h>
#include <strsafe.h>
#include "Shlwapi.h"
#pragma comment(lib, "User32.lib")
#pragma comment(lib, "shlwapi.lib")

void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
{
    TCHAR szFullPattern[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    HANDLE hFindFile;
    // first we are going to process any subdirectories
    PathCombine(szFullPattern, lpFolder,_T("*"));
    hFindFile = FindFirstFile(szFullPattern, &FindFileData);
    if(hFindFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
            if (_tcscmp(FindFileData.cFileName, _T("."))  != 0 &&
      _tcscmp(FindFileData.cFileName, _T("..")) != 0)
  {
                // found a subdirectory; recurse into it
                PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
                FindFilesRecursively(szFullPattern, lpFilePattern);
                //_tprintf_s(_T("%s\n"), lpFolder);
                }
            }
        } while(FindNextFile(hFindFile, &FindFileData));
        FindClose(hFindFile);
    }
    // now we are going to look for the matching files
    PathCombine(szFullPattern, lpFolder, lpFilePattern);
    hFindFile = FindFirstFile(szFullPattern, &FindFileData);
    if(hFindFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {
                // found a file; do something with it
                PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
                _tprintf_s(_T("%s\n"), szFullPattern);
            }
        } while(FindNextFile(hFindFile, &FindFileData));
        FindClose(hFindFile);
    }
}

DWORD mydrives = 100;// buffer length
char lpBuffer[100];// buffer for drive string storage
int main()
{
    DWORD dwSize = MAX_PATH;
    char szLogicalDrives[MAX_PATH] = {0};
    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);

    if (dwResult > 0 && dwResult <= MAX_PATH)
    {
        char* szSingleDrive = szLogicalDrives;
        while(*szSingleDrive)
        {

            // get the next drive
            FindFilesRecursively(_T(szSingleDrive), _T("*.txt"));
            szSingleDrive += strlen(szSingleDrive) + 1;
        }
    }
}

我测试了_tcscmp(FindFileData.cFileName, _T("C:\windows")) != 0等但它没有用,我也想知道如何在我的代码中使用getenv ("SystemDrive");来检测systemdrive并使用它代替C:\,抱歉提前

1 个答案:

答案 0 :(得分:0)

FindFileData.cFileName参数与搜索目录相关,在这种情况下为lpFolder。要获取完整的文件名,您需要将cFileNamelpFolder连接在一起 - 这个完整的文件名可以与Windows目录进行比较。你已经在find循环中的szFullPattern中完成了这个,所以你可以用它来比较Windows目录。

如其他答案所述,使用SHGetKnownFolderPath(Vista及更高版本)或SHGetFolderPath获取目录并进行不区分大小写的比较。