FindFirstFile oder FindFirstFileEx? ->redirected!



  • Hallo.
    Aus gegebenem Anlass war ich hier:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-124117-and-highlight-is-dateiendung.html

    und las:

    char* name=data.cFileName; 
    if (!strcmp(name,".")&&!strcmp(name,"..") 
    { 
      if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    .
    .
    .
    

    Und denke mir:
    So ist es bei mir auch beinahe!
    Allerdings frage ich auf

    if(drv_exe.dwFileAttributes == (DWORD)FILE_ATTRIBUTE_DIRECTORY)
    

    ab, und inserte dann ein Treeview Item mit jeweils abhängigem Image,
    allerdings fehlerhaft.

    Meine Fragen sind:
    a)
    Obiges Beispiel muss ich verwenden, weil ich das DWORD nicht nach dem jeweiligen Wert checke, sondern auf das gesetzte Bit, welches für FILE_ATTRIBUTE_DIRECTORY steht, oder?
    b)
    Bei mir ist es ähnlich, ich will nur Directories und .exe's angezeigt bekommen.
    In der FindFirstFileEx gibt es irgendwelche Filterkriterien.
    Weiss jemand, wie man die einsetzt und ob man die für ne .exe Filterung verwenden kann? .....
    Zusätzlich.: Wo zur Hölle wird die Endung gespeichert?
    Denn eine Zuweisung zum Namen des TreeViewItems aus dem CFileName der WI32_FIND_DATA Struktur liefert mir zwar alle Endungen, die ich habe ( z.B.Bmp) aber keine .exe- Endungen....
    ..die Items , die exes sind, werden dann ohne Endung angezeigt.
    .mich wunderts.
    Danke für n KLEINEN Tipp!
    🤡



  • me-S-on schrieb:

    Obiges Beispiel muss ich verwenden, weil ich das DWORD nicht nach dem jeweiligen Wert checke, sondern auf das gesetzte Bit, welches für FILE_ATTRIBUTE_DIRECTORY steht, oder?

    Richtig. Wenn du auf Gleichheit prüfst, gehen dir die Verzeichnisse durch die Lappen, bei denen noch weitere Flags gesetzt sind.

    Bei mir ist es ähnlich, ich will nur Directories und .exe's angezeigt bekommen.
    In der FindFirstFileEx gibt es irgendwelche Filterkriterien.
    Weiss jemand, wie man die einsetzt und ob man die für ne .exe Filterung verwenden kann? .....

    Du kannst doch beim ersten Parameter von FindFirstFileEx "pfad/*.exe" angeben. Dir muss nur klar sein, dass du dann zwei Suchläufe brauchst: Einen für die Verzeichnisse und einen für die .exe-Dateien.

    Zusätzlich.: Wo zur Hölle wird die Endung gespeichert?
    Denn eine Zuweisung zum Namen des TreeViewItems aus dem CFileName der WI32_FIND_DATA Struktur liefert mir zwar alle Endungen, die ich habe ( z.B.Bmp) aber keine .exe- Endungen....
    ..die Items , die exes sind, werden dann ohne Endung angezeigt.
    .mich wunderts.

    Ich hab's schon mal gesagt: Du machst etwas falsch.

    Ohne deinen Code kann man dazu nicht mehr sagen. Ich dachte, das sei inzwischen klar geworden.



  • ok... code folgt heute Nachmittag.
    Jetzt bin ich auf der Stelle und arbeite.....
    den fragwürdigen Codeschnipsel poste ich dann heute, ca 18.00.
    .
    Danke bisher!



  • Entschuldige die Verspätung, aber ich war noch dran, das selber zu lösen.

    Ähem, ich frage mich gerade, ob man FOLGENDES nur über die messages und das Abfangen derer richtg regeln kann, oder, ob es eine geeignete Schleife geben kann.
    Ich will alle Files und Ordner in einem Ordner angezeigt bekommen.
    Dieses soll aber so lange für jeden Ordner funktionieren, auch für seine kompletten Unterordner, falls der welche hat und auch für deren also als Schleife.
    Nur tu ich mich schwer mit der Logik dieser Schleife, wenn ich ehrlich bin.

    (Eigentlich will ich nur Ordner und .EXE angezeigt bekommen).
    Hier mal der Code der gesamten DLgProc, wichtiges ist fett!

    // this file contains the message function for the config dialog
    #include<commctrl.h>
    #include<shlwapi.h>
    #include<stdio.h>
    #define IS_BIT(val,bit)  (( val) & (1 << (bit)))
    
        #ifndef BITSPERBYTE
            #define BITSPERBYTE 8
        #endif
    // this is necessary to analyse the bitmask, returned by GetLogicalDrives
    // the macro IS_BIT takes a value and compares this value by an bit addition
    // with 1, stepping through the whole DWORD return value... it scans the dword
    // for the set bits, which are actually 1, returns true, if it is so........
    // further information is given in the implementation below 
    
    LRESULT CALLBACK DlgProc(HWND hdlg, UINT hdlgc, WPARAM dlgm_Wflags,LPARAM dlgm_Lflags)
    {
       HWND  htv;
       InitCommonControls();       // very important for loading the comctl.dll
        static DWORD drives;
        static HANDLE di_fi;
        static WIN32_FIND_DATA df;         // which contains extended controls following the
                                           // ocx.modell. Here we need the TreeView-control!!!
    
      static HBRUSH hbrg;                  // this is necessary to keep 
                                           // the brush in the memory
    
      switch(hdlgc)
      {     
            case WM_INITDIALOG:
            {
                htv = CreateWindowEx(0,WC_TREEVIEW,"Tree View",
                                    WS_VISIBLE | WS_CHILD | WS_DLGFRAME | 
                                    TVS_HASLINES |WS_HSCROLL | WS_VSCROLL |                                
                                    ES_AUTOHSCROLL | ES_AUTOVSCROLL |
                                    TVS_LINESATROOT | TVS_HASBUTTONS ,
                                    10,80,160,180,
                                    hdlg,
                                    (HMENU)ID_DLG_TREE1,
                                    (HINSTANCE)GetModuleHandle(NULL),
                                    NULL
                                );
    // here we start with the datainput for the treeview's elements                            
    // obtaining all drives---------------------------------------------------------
    
    // here the image list of images for the treeview items is initialized
    // icons are defined in the ressource
            int ico_num = 5;
            int hicon_root,hicon_drive,hicon_folder,hicon_openfolder,hicon_exe; // handles to the icons
            HIMAGELIST hil;        // handle to list of images
            HICON hico;          // handle to the actual icon to initialize
    
            if((hil = ImageList_Create(16,16,ILC_MASK,ico_num,0)) == NULL)                
            {
                MessageBox(NULL,"Image List creation failed","Image List",MB_OK);
                return 1;
            }      
    
            hico = LoadIcon((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ROOT));
            char cdf[30];
            if(hico == NULL)
            {
             MessageBox(NULL, itoa(GetLastError(),cdf,10),"D",MB_OK);
            }
            // the actual icon handle now actually receives the ressource-icon
            hicon_root = ImageList_AddIcon(hil,hico);
            // the speicified handle to the icon now receives the value of 
            DeleteObject( hico);   // clearing gdi-objects for a mamory without not needed garbage
    
            hico = LoadIcon((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_DRIVE));
            hicon_drive = ImageList_AddIcon(hil,hico);
            DeleteObject( hico);
    
            hico = LoadIcon((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_FOLDER));
            hicon_folder = ImageList_AddIcon(hil,hico);
            DeleteObject( hico);
    
            hico = LoadIcon((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_OFOLDER));
            hicon_openfolder = ImageList_AddIcon(hil,hico);
            DeleteObject( hico);
    
            hico = LoadIcon((HINSTANCE)GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_EXE));
            hicon_exe = ImageList_AddIcon(hil,hico);
            DeleteObject( hico);
            // associating the initialized image list with the treeview-control, which needs it
            TreeView_SetImageList(htv,hil,TVSIL_NORMAL);
    
            // here we initialize the treeview items by obtaining their names (below) 
            // and their level, which will be root or parent fot the test
            drives = GetLogicalDrives();
            char drv_spec[32];
            UINT drv_type;       
            char drv_root[20];
    
            TVITEM tvi;
            TVITEM tvir;        
            TVINSERTSTRUCT tvins;
            TVINSERTSTRUCT tvinsr;
            static HTREEITEM tiact = (HTREEITEM)TVI_FIRST;
            static HTREEITEM tiroot = (HTREEITEM)TVI_ROOT;
            HTREEITEM hti0;
            HTREEITEM hti1;
            HTREEITEM hti2;
    
            tvi.mask = TVIF_TEXT | TVIF_IMAGE 
                      | TVIF_SELECTEDIMAGE | TVIF_PARAM |TVIF_CHILDREN; 
    
            tvi.pszText = "System";
            tvi.hItem = hti0;
            tvi.cchTextMax = 10; 
            tvi.iImage = hicon_root;
            tvi.iSelectedImage = hicon_root;
            tvi.cChildren = 1;
            tvi.lParam = 0;//(LPARAM)nLevel; 
    
            tvins.item = tvi; 
            tvins.hInsertAfter = TVI_ROOT; 
            tvins.hParent = TVI_ROOT;                
    
            hti0 = (HTREEITEM)SendMessage(htv,TVM_INSERTITEM,0,
                                           (LPARAM)(LPTVINSERTSTRUCT)&tvins);
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                            AB HIER!
    
            WIN32_FIND_DATA dir_exe;
            HANDLE fh;
            char path[MAX_PATH];
            for(int c = 0; c < (sizeof(drives)* BITSPERBYTE);c++)
            {
                if(IS_BIT(drives,c))
                {
                    PathBuildRoot(drv_root,c);
    
                    drv_type = GetDriveType(drv_root);              
                    if(drv_type == DRIVE_FIXED)   // all drives are fixed, none is 
                    {        
                        tvi.pszText = drv_root;
                        tvi.hItem = hti1;
                        tvi.cchTextMax = 15; 
                        tvi.iImage = hicon_drive;
                        tvi.iSelectedImage = hicon_drive;
    
                        tvi.lParam = 0;//(LPARAM)nLevel; 
                        tvins.item = tvi; 
                        tvins.hInsertAfter = TVI_SORT; 
                        tvins.hParent = hti0;
                        hti1 = (HTREEITEM)SendMessage(htv, 
                                                      TVM_INSERTITEM, 
                                                      0,
                                                      (LPARAM)(LPTVINSERTSTRUCT)&tvins);
    
                        strcpy(path,drv_root);
                        strcat(path,"\\*");
                        fh = FindFirstFileEx(path,FindExInfoStandard,&dir_exe,FindExSearchNameMatch,NULL,0);
                        if(fh!=0)
                        {
                                tvi.pszText = dir_exe.cFileName;
                                tvi.hItem = hti1;
                                tvi.cchTextMax = MAX_PATH;
                                if(dir_exe.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                                {
                                    tvi.iImage = hicon_folder;
                                    tvi.iSelectedImage = hicon_openfolder;
                                }
                                else
                                {
                                    tvi.iImage = hicon_exe;
                                    tvi.iSelectedImage = hicon_exe;
                                }                    
    
                                tvi.lParam = 0;//(LPARAM)nLevel; 
                                tvins.item = tvi;
                                tvins.hInsertAfter = TVI_SORT; 
                                tvins.hParent = hti1;
                                hti1 = (HTREEITEM)SendMessage(htv, 
                                                      TVM_INSERTITEM, 
                                                      0,
                                                      (LPARAM)(LPTVINSERTSTRUCT)&tvins);
                                while(FindNextFile(fh,&dir_exe) != 0)
                                {
                                    tvi.pszText = dir_exe.cFileName;
                                    tvi.hItem = hti1;
                                    tvi.cchTextMax = MAX_PATH;
                                    if(dir_exe.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                                    {
                                        tvi.iImage = hicon_folder;
                                        tvi.iSelectedImage = hicon_openfolder;
                                    }
                                    else
                                    {   
                                        tvi.iImage = hicon_exe;
                                        tvi.iSelectedImage = hicon_exe;
                                    }                    
    
                                    tvi.lParam = 0;//(LPARAM)nLevel; 
                                    tvins.item = tvi;
                                    tvins.hInsertAfter = TVI_SORT; 
                                    tvins.hParent = TreeView_GetParent(htv.hti1);
                                    hti2 = (HTREEITEM)SendMessage(htv, 
                                                      TVM_INSERTITEM, 
                                                      0,
                                                      (LPARAM)(LPTVINSERTSTRUCT)&tvins);
                                }
                        } 
                    }
                }
             }                          BIS HIER
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
            break;
            }
    
            case WM_NOTIFY:
            {
                switch((int)dlgm_Wflags)
                {
                    case (ID_DLG_TREE1):
                    {
                        switch(((LPNMHDR)dlgm_Lflags)-> code) // thats the way to obtain the pointers element of the struct
                        {
                            case(NM_CLICK):
                            { 
                                // here we now have to add all children of the drives and
                                // all their children.
    
                             break;
                            }       
                        return 0;
                        }
    
                    break;
                    }
    
                return 0;
                }
            break;
            }    
                             BIS HIER         
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                         
    
            case WM_CTLCOLORDLG:
            {  
                hbrg = CreateSolidBrush(RGB(0,80,80));// this message is very interesting: it allows to 
                                  // modify the whole dialog before it is shown on the screen
                                  //  and so it is very simple ( because ist is only a control)
                SetBkColor((HDC)dlgm_Wflags,(COLORREF)hbrg);// to set the background color
    
            return (BOOL) hbrg;
            }
            case WM_CTLCOLORSTATIC:
            {    
                 SetTextColor((HDC)dlgm_Wflags,RGB(255,255,255));
                 SetBkMode((HDC)dlgm_Wflags,TRANSPARENT);// to set the background color            
            return (BOOL) hbrg;
            break;
            }           
            case WM_COMMAND:
            {
                switch(LOWORD(dlgm_Wflags))
                {                
                return (TRUE);
                }                
            break;        
            }
    
            case WM_DESTROY:
            case WM_CLOSE:    
            {
                DeleteObject(hbrg);        // GDI-failures often occur, because a gdi object is
                EndDialog(hdlg,0);         // not destroyed, an so many of them are existent, better
            return (TRUE);                  // is, to destroy them after usage.
            }                
      default:
            return false;
      }
    
    return true;
    }
    

    Ich weiss, es ist mühselig, aber daher habe ich die relevanten Stellen fett hervorgehoben.
    Vielen Dank fürn paar Hints!



  • Es gibt zwei Möglichkeiten:
    Du kannst eine Liste anlegen, mit allen gefundenen Unterverzeichnissen und deren Knoten im Baum. Wenn du mit dem Durchsuchen des Wurzelverzeichnis fertig bist, arbeitest du in einer Schleife die Liste ab, und hängst neu gefundene Verzeichnisse weiter hinten an. Wenn du die Liste durchgearbeitet hast, bist du fertig.

    Die zweite Möglichkeit wäre eine rekursive Funktion, die sich für jedes gefundene Unterverzeichnis selbst aufruft. Dann brauchst du keine Liste.



  • Also erstens solltest du deinen Post bearbeiten. Warum ist genau beim relevanten fett markierten Code keine Einrückung drinn? Das liest sich doch kein mensch durch!
    Und Ich finde so eine Dateisuche ist das beste Beispiel für eine Rekursive Funktion. Aber hattest du nicht schon zigg Beispiele auch in anderen Post für eine rekursive Dateisuche bekommen?

    schirrmie



  • Als ich bold drückte, geschah es!
    Ich ändere es mal ab, gleich!
    Rekursion, dachte ich mir auch schon.
    So von wegen:
    wenn is folder Attribut zutrifft, dann mache das was du getan bisher getan hast und all das nach der Abfrage tust auch für den Fall, gehst dann aber weiter...
    ist schon kopfschrottend!!!
    Aber die Logik will mir nicht in den Schädel, und goto?
    Ne, jeder code kommt ohne goto aus.
    So versuche ich mal ,den ganzen Kram in ne Funktion unterzubringen...
    und diese sich selber aufrufen zu lassen, nur mit den Parametern wirds happig.
    Mal sehen.
    Aber für das Einrücken kann ich nichts, ich klickte nur auf B, nd der nahm die indents raus!!
    Dane schonmal!



  • Also wie gesagt ich bin der meinung das du schon beispiele für ne rekursive funktion bekommen hattest in nem anderen thread.

    Die Logik ist doch nicht soo schwer.
    Du hast eine Funktion die als Parameter einen Ordnerpfad und ein TreeView Item erwartet (Die Funktion sucht dann diesen Ordnerpfad nach Dateien und weiteren Ordnern und trägt das gefunden als Child beim TreeView item als Child ein).
    Du rufst die Funktion mit einem OrdnerPfad (meinentwegen C: [ich weis ist kein ordner, aber ladde]) auf (dieser Ordner ist in deinem TreeView als Root)
    Wenn du jetzt einen Ordner findest trägst du ihn als ChildItem ein und rufst die selbe Funktion mit diesen Ordnerpfad und dem neuen ChildItem auf.
    Wenn du eine Datei findest trägst du sie als ChildItem in deinem TreeView ein.

    Und das wars doch schon.

    schirrmie



  • um das hinzubekommen.
    Aber auch, um die nötigen SkillZ so lässig wie Du es tust, mal jemandem zu geben, der ähnliches fragt.

    Weisst Du, jemand, der Chaostheorie oder Quantenphysik oder die Maxwellschen Gleichungen beherrscht, dem würde es auch nicht schwerfallen, sie als Alltagsgebrauch ebenmal daher zu posten.... ich aber bin vergleichsweise ungelernt in Sachen Rekursion
    Wenn Du verstehst wie ich es meine...vergleichweise!
    Danke bisher.
    Bis sehr bald!



  • Also nur mal so ich finde das ich ein Anfänger in Sachen Programmierung bin auch wenn ich mich schon mit vielen Themen auseinander gesetzt habe! Und zieh dir einfach mal ein paar gute tuts über C rein in vielen gibt es auch was über Rekursion und wenn du danach auch noch googlest solltest du auf jeden fall etwas finden, also nicht in Selbstmitleid öden sondern was tun 🙂

    MfG schirrmie



  • Habe n Lernplan:
    Montag: C/C++/WinApi
    Dienstag: Linux: Shellscritping, ASM
    Mittwoch:C/C++/WinApi
    Donnerstag: Linux: Shellscritping, ASM
    Freitag:C/C++/WinApi
    Samstag: Dies und das
    Sonntag: Dies und das.
    Aber wenne inner Woche 8,5-10 Stunden am Rechner sitzt ( NEIN!!!LEIDER NICHT IN EINEM DIESER GEBIETE) und dann anch Hause kommst, ruhste erstmal den Sehapparat aus...... und dann klatsch ich mich abends vorn Rechner und tippe drauf los.
    Wenn ich hier gekündigt werden sollte, dann habe ich auch den ganzen Tag Zeit.
    Und vor allem dann auch noch mehr Lust.
    Aber so geht das nur Etappenweise....
    und gerade C in Verbindung mit NASM ..... das ist suuperfett!
    Aber ich bin heute wieder dran..... am Rekursieren dieser Funktion ..... und mal sehen...... ich habe mir auch schon n PAP gemalt und versucht, die Logik dahinter zu verstehen, von wegen:
    void EINEFUNKTION()
    {
    - wenn find first file = Ordner
    dann:
    - füge Item ein
    - änder parent, änder Pfad
    - call EINEFUNKTION()

    - wenn find first file kein Ordner
    dann:
    - füge an passender Stelle ein

    - wenn find next file = Ordner
    dann:
    - füge Item ein
    - ändere parent, ändere Pfad
    - call EINEFUNKTION()

    - wenn find next file kein Ordner
    - füge an derzeitiger Stelle in Tree ein
    }

    Nur praktisch war ich die ganzen Pfingstfeiertage eher GAR NICHT DRAN.
    Schlimm, ne?
    Da zieht auch nicht mehr: War krank. Auch wenns so war........
    Bis denne....

    Bei Problemen poste ich hier, ok?
    Neuer Thread muss ja nicht aufgemacht werden.
    Danke bis hierhin!


Anmelden zum Antworten