我有一些代码可以搜索所有驱动器以查找所有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:\
,抱歉提前
答案 0 :(得分:0)
FindFileData.cFileName
参数与搜索目录相关,在这种情况下为lpFolder
。要获取完整的文件名,您需要将cFileName
与lpFolder
连接在一起 - 这个完整的文件名可以与Windows目录进行比较。你已经在find循环中的szFullPattern
中完成了这个,所以你可以用它来比较Windows目录。
如其他答案所述,使用SHGetKnownFolderPath
(Vista及更高版本)或SHGetFolderPath
获取目录并进行不区分大小写的比较。