2016-10-03 2 views
0

은 주어진 경로에있는 모든 폴더, 하위 폴더 및 파일을 나열하는 방법이 있나요? 예를 들면 : (c : \ myfolder)와 같이 표시하고, 거기에 포함 된 각 파일 및 폴더에 대한 전체 경로를 인쇄 하시겠습니까? 목록 폴더, 하위 폴더 및 파일 (창)

c:\myfolder\folder1\ 
c:\myfolder\folder2\ 
c:\myfolder\folder2\f1 
c:\myfolder\folder2\f2\g1 
c:\myfolder\test.txt 
c:\myfolder\t.txt 

나는이 예제를 발견하지만 리눅스 용으로 설계 :

int is_directory_we_want_to_list(const char *parent, char *name) { 
    struct stat st_buf; 
    if (!strcmp(".", name) || !strcmp("..", name)) 
     return 0; 

    char *path = alloca(strlen(name) + strlen(parent) + 2); 
    sprintf(path, "%s/%s", parent, name); 
    stat(path, &st_buf); 
    return S_ISDIR(st_buf.st_mode); 
} 

int list(const char *name) { 
    DIR *dir = opendir(name); 
    struct dirent *ent; 

    while (ent = readdir(dir)) { 
     char *entry_name = ent->d_name; 
     printf("%s\n", entry_name); 

     if (is_directory_we_want_to_list(name, entry_name)) { 
      // You can consider using alloca instead. 
      char *next = malloc(strlen(name) + strlen(entry_name) + 2); 
      sprintf(next, "%s/%s", name, entry_name); 
      list(next); 
      free(next); 
     } 
    } 

    closedir(dir); 
} 

출처 :How to recursively list directories in C on LINUX

+2

'FindFirstFile'은 원하는 것입니다. https://msdn.microsoft.com/fr-fr/library/windows/desktop/aa365200%28v=vs.85%29.aspx – purplepsycho

+0

컴파일러는 무엇입니까? – BLUEPIXY

+0

@BLUEPIXY 내가 사용하고'비주얼 스튜디오 2010' –

답변

0

상이 할 수 있고, 가장 간단한 방법은 FindFirstFile을, 및 FindNextFile과 FileClose를 사용하는 것이다.

그러나 유닉스 버전에서 어쨌든 약간의 차이가 있습니다 : 대신 디렉토리를 탐색의 folder\* 같은 이름을 검색해야한다는 FindFirstFile는 이름을 부여하며, FindNextFile과 다른 사람을 얻는다.

여기에 전체 코드 예제입니다 : 코드 위

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

#ifdef UNICODE 
#define fmt "%S" 
#else 
#define fmt "%s" 
#endif 

void process_file(LPCTSTR filename) { 
    // TODO: implement actual file processing 
    printf(fmt, filename); 
    fputs("\n", stdout); 
} 

void process_folder(LPCTSTR foldername) { 
    WIN32_FIND_DATA findFileData; 
    HANDLE handle; 
    LPTSTR newfolder = malloc(sizeof(TCHAR) *(_tcslen(foldername) + 3)); // add some room for the additional \* 
    _tcscpy(newfolder, foldername); 
    _tcscat(newfolder, _T("\\*")); 
    handle = FindFirstFile(newfolder, &findFileData); 
    if (handle != INVALID_HANDLE_VALUE) { 
     while(1) { 
      // skip . and .. to avoid infinite recursion 
      if ((_tccmp(findFileData.cFileName, _T(".")) != 0) && (_tccmp(findFileData.cFileName, _T("..")) != 0)) { 
       // compute name as folder\filename 
       LPTSTR newname = malloc(sizeof(TCHAR) * (_tcslen(foldername) + _tcslen(findFileData.cFileName) + 2)); 
       _tcscpy(newname, foldername); 
       _tcscat(newname, _T("\\")); 
       _tcscat(newname, findFileData.cFileName); 
       if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { 
        process_folder(newname); // recurse if is is a directory 
       } 
       else { 
        process_file(newname); // process other files 
       } 
       free(newname); // consistenly free any malloc 
      } 
      if (FindNextFile(handle, &findFileData) == FALSE) break; // exit the loop when folder is exhausted 
     } 
     FindClose(handle); 
    } 
    free(newfolder); 
} 

int _tmain(int argc, TCHAR *argv[]) { 
    if (argc != 2) { 
     fputs("Usage: ", stderr); 
     fprintf(stderr, fmt, argv[0]); 
     fputs(" top_folder\n", stderr); 
     return 1; 
    } 
    process_folder(argv[1]); 
    return 0; 
} 

여전히 일부 오류 조건 처리를 부족하지만 찾기 {처음 | 다음}의 재귀 사용의 예입니다 윈도우에서 파일.

+0

이 코드는 C++로 작성되었으므로 montionned로 C 예제를 사용하십시오. :) 어쨌든 여러분의 기여에 감사드립니다. –

+0

@CoderAsker : Oups, 내 나쁜 :-(는 희망이 C로 변환 쉬웠다 ... –

+0

많은 오류가 좋은 변환 ... 작동하지 솔루션, 죄송합니다 :) –

0

사용 _popendir /S /B /OG와.

코드 샘플 (당신은 코드를 줄일 수 있습니다). @purplepsycho 의해 제안
는 (폴더의 표시 위치가 예상. DIY :-)

#include <Windows.h> 
#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]){ 
    if(argc != 2){ 
     fprintf(stderr, "Usage : %s path\n", argv[0]); 
     return -1; 
    } else { 
     char buff[1024];//or MAX_PATH + α 
     FILE *fp; 

     sprintf(buff, "dir %s /S /B /OG", argv[1]); 
     if(NULL == (fp = _popen(buff, "r"))){ 
      perror("can't open pipe"); 
      return -2; 
     } 
     while(fgets(buff, sizeof buff, fp)){ 
      char *p = strchr(buff, '\n'); 
      *p = 0; 
      if(FILE_ATTRIBUTE_DIRECTORY & GetFileAttributes(buff)){ 
       *p = '\\'; 
       p[1] = '\0'; 
      } 
      puts(buff); 
     } 
     _pclose(fp); 
    } 
    return 0; 
}