2016-06-13 97 views
0

我有一個搜索所有驅動器以查找所有txt擴展一些代碼windows文件夾,但我的問題是,我想排除在系統驅動器的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");在我的代碼來檢測系統驅動,並提前

使用它,而不是 C:\,對不起
+1

注意:NTFS文件系統不區分大小寫,但文件名**有**情況,因此您應該使用_tcsicmp來對字符串進行不區分大小寫的比較。 –

回答

0

The在這種情況下,參數是相對於搜索目錄lpFolder。要獲得完整的文件名,您需要連接cFileNamelpFolder--這個完整的文件名可以與Windows目錄進行比較。您已經在查找循環中的szFullPattern中完成了這項工作,因此您可以使用它與Windows目錄進行比較。

正如在其他答案中提到的那樣,使用SHGetKnownFolderPath(Vista及更高版本)或SHGetFolderPath來獲取目錄並進行不區分大小寫的比較。