2014-03-25 64 views
0

我想遞歸列出使用帶所需擴展名文件名的windows API的目錄內的文件名。windows c代碼遞歸地列出文件名在一個具有所需擴展名的目錄內

我試過了with this但Shlwapi.h似乎不適合函數PathCombine。你能不能讓我知道它是否有效?

#include <windows.h> 
#include <tchar.h> 
#include <stdio.h> 
#include <strsafe.h> 
#include "Shlwapi.h" 
#pragma comment(lib, "User32.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) 
      { 
       // found a subdirectory; recurse into it 
       PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); 
       FindFilesRecursively(szFullPattern, lpFilePattern); 
      } 
     } 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); 
    } 
} 

int main() 
{ 

    FindFilesRecursively(_T("E:\\Logstotest"), _T("*.log")); 
    return 0; 
} 
+2

請詳細說明「Shlwapi.h似乎不適合功能PathCombine」 – fritzone

+3

問題是什麼?它不會編譯?它會崩潰嗎?你沒有得到預期的產出?要麼... ?順便說一句:你應該寫''而不是''Shlwapi.h''和'#pragma comment(lib,「Shlwapi.lib」)''可能有幫助。 –

+2

你應該從遞歸中排除'.'和'..',否則它永遠不會結束。 – Ryzhehvost

回答

0

如果您排除名爲「。」的直接命令,則您的代碼正常工作。和「..」。

你的第一個的主體while循環應該是這樣的:

if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
{ 
    // Exclude "." and ".." directories 
    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); 
    } 
} 

的 「」目錄是當前目錄,並且如果遞歸到該目錄中,則永遠不會退出遞歸,因爲您將一遍又一遍地掃描同一目錄,直到堆棧已滿。

「..」目錄是當前目錄的「上方」目錄,並且如果掃描該目錄,則出於與上述相同的原因也會遇到無限遞歸。

順便說一句,您可以通過在cmd窗口中使用dir命令來查看這些目錄。

相關問題