2016-06-13 28 views
0

すべてのドライブを検索してすべてのドライブを検索する小さなコードがありますが、私の問題は除外します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となどをテストしたが、それはまた、私は、私はシステムドライブを検出し、事前

で申し訳ありません C:\、のではなく、それを使用するために私のコードで getenv ("SystemDrive");を使用するにはどうすればよいかを知りたい、動作しませんでした:、私のコードがあります
+1

注意:NTFSファイルシステムでは大文字と小文字は区別されませんが、ファイル名には**の大文字と小文字の区別がありますので、大文字と小文字を区別しない文字列の比較には '_tcsicmp 'を使用してください。 –

答えて

0

FindFileData.cFileNameのパラメータは検索ディレクトリとの相対的なもので、この場合はlpFolderです。完全なファイル名を取得するには、cFileNamelpFolderに連結する必要があります。この完全なファイル名はWindowsディレクトリと比較できます。 findループの内側に既にszFullPatternでこれを行っています。そうすれば、それを使ってWindowsディレクトリと比較することができます。

他の回答に記載されているように、SHGetKnownFolderPath(Vista以上)またはSHGetFolderPathを使用してディレクトリを取得し、大文字と小文字を区別しない比較を行います。

関連する問題