Получить список файлов по указаному пути. С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by rudi, 20 Nov 2010.

  1. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    Может кому пригодиться
    Так можно получать список файлов по указаному пути
    подключаем 2 файла это
    strsafe.h
    GetListDir.cpp

    Вызываем функцию
    _GetListDirs("C:\\MyData");
    и получаем список файлов что находяться по указаному пути C:\\MyData

    Данные сохраняются в глобальных переменных
    char *ListProject[1000]; // Массив имен , сюда сохраняться полученные файлы
    int CountListProject; //Колличество полученных файлов



    GetListDir.cpp
    PHP:
    #include "GetListDir.h"
    #include <windows.h>
    #include "strsafe.h"


    char *ListProject[1000];  //
    int CountListProject =0;
    //----------------------------------------
    int _GetListDirs(char *argv)
    {
      if(
    CountListProject 0//Очищаем выделеную память
           
    {
              for(
    int b=0b<CountListProjectb++)
                 
    delete [] ListProject[b];
           }
       
    CountListProject =0;

       
    WIN32_FIND_DATA ffd;
       
    LARGE_INTEGER filesize;
       
    TCHAR szDir[MAX_PATH];
       
    size_t length_of_arg;
       
    HANDLE hFind INVALID_HANDLE_VALUE;
       
    DWORD dwError=0;


       
    // Check that the input path plus 3 is not longer than MAX_PATH.
       // Three characters are for the "\*" plus NULL appended below.

       
    StringCchLength(argvMAX_PATH, &length_of_arg);

       
    // Prepare string for use with FindFile functions.  First, copy the
       // string to a buffer, then append '\*' to the directory name.

       
    StringCchCopy(szDirMAX_PATHargv);
       
    StringCchCat(szDirMAX_PATHTEXT("\\*"));

       
    // Find the first file in the directory.

       
    hFind FindFirstFile(szDir, &ffd);
       
       
    // List all the files in the directory with some info about them.

       //Обнуляю счетчик проэктов
       
    CountListProject=0;
       
    int sz;
       do
       {
          if (
    ffd.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)
          {
            ;
          }
          else
          {
             
    filesize.LowPart ffd.nFileSizeLow;
             
    filesize.HighPart ffd.nFileSizeHigh;

             
    ListProject[CountListProject] = new char[256];
             
    StringCbCopy(ListProject[CountListProject], 256ffd.cFileName);
             
    CountListProject++;
          }
       }
       while (
    FindNextFile(hFind, &ffd) != 0);

       
    dwError GetLastError();

       
    FindClose(hFind);
       return 
    dwError;
    }
    //------------------------------------
    скачать strsafe.h

    Если у вас есть свои варианты
    буду рад их увидеть ;)
     
    #1 rudi, 20 Nov 2010
    Last edited: 20 Nov 2010
  2. Mayor16

    Mayor16 Member

    Joined:
    23 Oct 2010
    Messages:
    107
    Likes Received:
    24
    Reputations:
    6
    вопрос

    А как, например, получить все файлы в папке которая лежит вместе с прогой?

    все, это понял) но теперь вылетает:
    "Unhandled exception at 0x6412d540 (msvcr100d.dll) in Brute.exe: 0xC0000005: Access violation reading location 0x00000000."
     
    #2 Mayor16, 20 Nov 2010
    Last edited: 20 Nov 2010
  3. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    1. Это не с++, это практически си)
    Если бы тут был С++, то можно было использовать std::string/std::wstring и прочие удобные вещи вроде смартпоинтеров.
    2. Что будет, если у меня больше 1000 файлов в директории?
    3. Глобальные переменные - не очень хорошо.
    4.
    PHP:
    if (ffd.dwFileAttributes FILE_ATTRIBUTE_DIRECTORY)
          {
            ;
          }
          else
          { 
    Ужс...
     
  4. Mayor16

    Mayor16 Member

    Joined:
    23 Oct 2010
    Messages:
    107
    Likes Received:
    24
    Reputations:
    6
    Напишите лучший вариант)
     
  5. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    Code:
    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
          { 
            ; 
          } 
          else 
          { 
    
    так
    Code:
    mask = FILE_ATTRIBUTE_DIRECTORY
    if (ffd.dwFileAttributes & mask ^ mask){ 
        ...do something.... 
    } 
    
    или так
    Code:
    mask = FILE_ATTRIBUTE_DIRECTORY
    if ((ffd.dwFileAttributes & mask) == 0){ 
        ...do something.... 
    } 
    
    или так
    Code:
    mask = FILE_ATTRIBUTE_DIRECTORY
    if (!(ffd.dwFileAttributes & mask)){ 
        ...do something.... 
    } 
    
    или так
    Code:
    mask = FILE_ATTRIBUTE_DIRECTORY
    if (ffd.dwFileAttributes & mask ? 0 : 1){ 
        ...do something.... 
    } 
    
     
    #5 greki_hoy, 20 Nov 2010
    Last edited: 20 Nov 2010
  6. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    согласен код не самый лучший
    но нашол в инете и просто немного подстроил под себя
    и он не предусмотрен для очень большого списка файлов
    да тут в коде не более 1000 файлов можно получить

    а по поводу
    Ты указываешь полный путь в функцию _GetListDirs(char *argv)
    ???

    У кого есть лучше вариант
    буду рад увидеть,вариант изложенный мною выше не является
    самым надежным но для небольших списков работает
     
  7. Mayor16

    Mayor16 Member

    Joined:
    23 Oct 2010
    Messages:
    107
    Likes Received:
    24
    Reputations:
    6
    Нет, не полный, но мне так и надо, можно что то сделать?
     
  8. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    указывать нужно полный
    начиная с диска
    например C:/Papka

    можно так получить например
    например твоя программа находиться гдето в недрах диска
    а рядом с твоим *.exe лежит папка по имени Papka
    То делаем так
    char Dir[1024];
    sprintf(Dir, "%s%s", ExtractFileDir(Application->ExeName).c_str(), "\\Papka");

    _GetListDir(Dir);
     
    #8 rudi, 20 Nov 2010
    Last edited: 20 Nov 2010
  9. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    ну и если работаеш на таком низком уровне то не бойся использовать realloc тут этот костыль new не нужен и вместо аллоцирования и копирования юзай strdup
     
  10. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    мой вариант, выводит все содержимое своей директории в ListView:
    Code:
    #define ID1 123
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    
    HWND hwndFList;
    HINSTANCE hInstance;
    char szFileName[256];
    char message[512];
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    BOOL OnCreate(HWND,LPCREATESTRUCT);
    void OnGetMinMaxInfo(HWND,LPMINMAXINFO);
    int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nShowCmd)
    {
    	HWND hwnd;
    	MSG msg;
    	WNDCLASS wc;
    	hInstance = hInst;
    	InitCommonControls();
    
    	memset(&wc,0,sizeof(wc));
    	wc.hbrBackground = GetStockBrush(WHITE_BRUSH);
    	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    	wc.hInstance = hInst;
    	wc.lpfnWndProc = WndProc;
    	wc.lpszClassName = "MainWindow";
    	wc.style = CS_HREDRAW|CS_VREDRAW;
    	RegisterClass(&wc);
    
    	hwnd = CreateWindow("MainWindow","File Manager",WS_OVERLAPPEDWINDOW,100,100,640,480,HWND_DESKTOP,NULL,hInst,NULL);
    	ShowWindow(hwnd,nShowCmd);
    	UpdateWindow(hwnd);
    
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return 0;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	switch(msg)
    	{
    	HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
    	HANDLE_MSG(hwnd,WM_GETMINMAXINFO,OnGetMinMaxInfo);
    	case WM_DESTROY: PostQuitMessage(0);
    		             break;
    	default: return DefWindowProc(hwnd,msg,wParam,lParam);
    	}
    }
    
    BOOL OnCreate(HWND hwnd,LPCREATESTRUCT)
    {
    	WIN32_FIND_DATA fd;
    	LV_COLUMN lvc;
    	LV_ITEM lvi;
    	char szFileSize[20];
    	DWORD dwFileSize;
    	int nIndex = 0;
    	HANDLE hFile;
    	HANDLE hOpenFile;
    
    	hwndFList = CreateWindowEx(0,WC_LISTVIEW,NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,0,0,640,480,hwnd,(HMENU)ID1,hInstance,NULL);
    	memset(&lvc,0,sizeof(LV_COLUMN));
    	lvc.mask = LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
    	lvc.fmt = LVCFMT_LEFT;
    	lvc.cx = 320;
    	lvc.pszText = "File Name";
    	ListView_InsertColumn(hwndFList,0,&lvc);
    	lvc.pszText = "File Size";
    	ListView_InsertColumn(hwndFList,1,&lvc);
    
    	memset(&lvi,0,sizeof(LV_ITEM));
    	lvi.mask = LVIF_TEXT;
    	lvi.cchTextMax = sizeof(LPWSTR);
    
    	hFile = FindFirstFile("*.*",&fd);
    	if(hFile==INVALID_HANDLE_VALUE)
    		return TRUE;
    	else
    	{
    		hOpenFile = CreateFile(fd.cFileName,GENERIC_READ,0,0,OPEN_EXISTING,0,NULL);
    		if(hOpenFile==INVALID_HANDLE_VALUE)
    			dwFileSize = 0;
    		else
    			dwFileSize = GetFileSize(hOpenFile,NULL);
    		wsprintf(szFileSize,"%d",dwFileSize);
    		lvi.pszText = fd.cFileName;
    		lvi.iItem = nIndex;
    		ListView_InsertItem(hwndFList,&lvi);
    		ListView_SetItemText(hwndFList,nIndex,1,szFileSize);
    		nIndex++;
    		CloseHandle(hOpenFile);
    
    		while(FindNextFile(hFile,&fd))
    		{
    			hOpenFile = CreateFile(fd.cFileName,GENERIC_READ,0,0,OPEN_EXISTING,0,NULL);
    			if(hOpenFile==INVALID_HANDLE_VALUE)
    				dwFileSize = 0;
    			else
    				dwFileSize = GetFileSize(hOpenFile,NULL);
    			wsprintf(szFileSize,"%d",dwFileSize);
    			lvi.pszText = fd.cFileName;
    			lvi.iItem = nIndex;
    			ListView_InsertItem(hwndFList,&lvi);
    			ListView_SetItemText(hwndFList,nIndex,1,szFileSize);
    			nIndex++;
    			CloseHandle(hOpenFile);
    		}
    	}
    
    	return TRUE;
    }
    
    void OnGetMinMaxInfo(HWND hwnd, LPMINMAXINFO lpmmi)
    {
    	lpmmi->ptMinTrackSize.x = 640;
    	lpmmi->ptMinTrackSize.y = 480;
    	lpmmi->ptMaxTrackSize.x = 640;
    	lpmmi->ptMaxTrackSize.y = 480;
    }
    
     
  11. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    компилирую в MSVC++ 6

    --------------------Configuration: AllDir - Win32 Debug--------------------
    Compiling...
    Main.cpp
    C:\Win32Api\AllDir\Main.cpp(67) : error C2065: 'WS_VISI' : undeclared identifier
    C:\Win32Api\AllDir\Main.cpp(67) : error C2065: 'BLE' : undeclared identifier
    C:\Win32Api\AllDir\Main.cpp(67) : error C2065: 'I' : undeclared identifier
    C:\Win32Api\AllDir\Main.cpp(67) : error C2146: syntax error : missing ')' before identifier 'D1'
    C:\Win32Api\AllDir\Main.cpp(67) : error C2660: 'CreateWindowExA' : function does not take 11 parameters
    C:\Win32Api\AllDir\Main.cpp(67) : error C2059: syntax error : ')'
    C:\Win32Api\AllDir\Main.cpp(86) : error C2065: 'OPEN_EXIS' : undeclared identifier
    C:\Win32Api\AllDir\Main.cpp(86) : error C2146: syntax error : missing ')' before identifier 'TING'
    C:\Win32Api\AllDir\Main.cpp(86) : error C2059: syntax error : ')'
    C:\Win32Api\AllDir\Main.cpp(101) : error C2146: syntax error : missing ')' before identifier 'TING'
    C:\Win32Api\AllDir\Main.cpp(101) : error C2059: syntax error : ')'
    Error executing cl.exe.

    AllDir.exe - 11 error(s), 0 warning(s)
     
  12. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    тут на форуме строки просто некоторые пробелами разделяются
     
  13. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    487
    Likes Received:
    184
    Reputations:
    5
    Компиляция без ошибок прошла
    а вот Построение проекта Build вызвала ошибку

    --------------------Configuration: AllDir - Win32 Debug--------------------
    Linking...
    Main.obj : error LNK2001: unresolved external symbol __imp__InitCommonControls@0
    Debug/AllDir.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    AllDir.exe - 2 error(s), 0 warning(s)


    __________
    Предпологаю непонятки с этой функцией
    InitCommonControls();
     
  14. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    у тебя должна быть подключена comctl32.lib:
    Code:
    #define ID1 123
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    [B]#pragma comment(lib, "comctl32.lib")[/B]
    
    либо в настройках проекта