Dateisuche unter Mac OS



  • Hallo,
    ich habe in C++ ein Programm geschrieben dass in einem Ordner und allen Unterordnern nach einem bestimmten File sucht.

    Ich verwende die FindFirstFile/FindNextFile Funktionen sowie auch andere windwosspezifische Anwendungen

    bool Path::readDirectory(string root){
         WIN32_FIND_DATA flData;   
         HANDLE hFind = FindFirstFile((root+"\\*").c_str(), &flData);   
         BOOL bOK = (hFind != INVALID_HANDLE_VALUE);    
         while((bOK != 0)){      
                    if((flData.cFileName[0] != '.')){         
                                if(flData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
                                           //Pfad der Unterverzeichnisse           
                                           string pfad = root+"\\"+flData.cFileName;             
                                           //Rekursion zum erfassen der Dateien in den Unterverzeichnissen            
                                           readDirectory(pfad);         
                                }//if...         
                                else{            
                                           //Hier wird der Pfad gespeichert            
                                           string pfad = root;
                                           //Wenn das File mit blabla.exe übereinstimmt
                                           if(strcmp (flData.cFileName,"blabla.exe") == 0){
                                                     int msgboxID = MessageBox(
                                                     NULL,
                                                     "path found:\n",
                                                     "Details",
                                                     MB_ICONINFORMATION | MB_OK
                                                     );
    
                                                     mPfad = pfad;
                                                     schreiben(mPfad);
                                                     return true;
                                                     break;
                                           }//if...
    
                                }//else...      
                    }//if...      
                                bOK = FindNextFile(hFind, &flData);
    
         }//while...
    
    }//function...
    

    Inwieweit ist es nun möglich oder auch sinnvoll diesen Code abzuändern, dass er auch auf einem MAC OS Betriebssystem läuft?

    Vielen Dank für eure Hilfe
    geneticZ



  • Das sinnvollste wäre wohl eine plattformunabhängige Bibliothek wie boost::filesystem zu verwenden...



  • Hallo,
    kannst du mir das genauer erklären?
    Habe von der Bibliothek noch nie was gehört 😞



  • Guckst du hier

    :schland:



  • Hi,
    danke das hilft schonmal.
    Wie ist das mit den "seperators" bei der Pfad angabe?
    Windows verwendet ja einen doppel "//", Linux soweit ich ich weiss nur nen einfachen "/" oder?
    Wie is das mit Mac OS?
    Oder gibts hier was Plattformübergreifendes wie "File.seperator"?

    Danke im Voraus
    geneticZ



  • Du kannst Pfade verbinden mit dem operator/=

    std::string root = "C:\\";
    boost::filesystem::path p(root);
    p /= "Windows";
    p /= "Temp";
    std::cout << p << std::endl; // Ausgabe unter Windows (XP): C:/Windows/Temp
    


  • ah ok, und "\=" ist also auf jedem Betriebssystem gültig?

    Das bring mich gleich zur nächsten Frage:
    Ist GetLogicalDriveStringsA() und GetDriveTypeA() nicht auch nur unter Windows verwendbar? 😕

    Danke
    geneticZ



  • 1. Ja, ist es (unter allen unterstützten Betriebssystemen natürlich).
    2. Das sind doch reine WinAPI-Funktionen oder? Also funktionieren die nur unter Windows.



  • ja, denke schon!
    gibt es zu den Funktionen irgendwelche Alternativen?



  • Kommt drauf an, was genau Du willst.
    Willst Du alle vorhandenen Laufwerke auflisten?



  • Ja, also mein bisheriges Programm listet mit GetLogicalDriveStringsA() alle vorhanden Laufwerke auf und checkt diese dann mit GetDriveTypeA() welchem Type sie angehören.
    Danach wird eben das erste Drive hergenommen und nach dem File durchsucht.

    Danke
    geneticZ



  • hmm, glaube nicht dass Du mit boost::filesystem eine plattformübergreifende Möglichkeit für die Auflistung
    der Laufwerke und -typen hast.
    Dazu müsstest Du wohl, je nachdem für welches Betriebssystem Du gerade
    kompilierst, entsprechende API-Funktionen verwenden.



  • Ok, weiss da jemand wie das dann für MAC OS aussehen müsste?



  • vielleicht findest Du hier was



  • In Mac OS X sind verwendbare Partitionen unter /Volumes eingehängt. Wenn du also z. B. eine Partition mit der Bezeichnung "mac" hast, ist alles, was du machen musst, nachsehen ob "/Volumes/mac/blabla.exe" existiert. Wenn du eine DVD "film" hast, musst du nachsehen, ob "/Volumes/film/blabla.exe" existiert. Sind alles normale Verzeichnisse. Können genau so gehandhabt und durchsucht werden wie normale Ordner. Völlig analog mit externen Festplatten, CD-Laufwerken, USB-Sticks oder sogar eingehängten Netzwerk-Freigaben. Alles was eingehängt und verwendbar ist, erscheint als Ordner unter /Volumes. Willst du alle verwendbare Geräte auflisten, musst du einfach nur die Ordner unter /Volumes auflisten.



  • minhen schrieb:

    In Mac OS X sind verwendbare Partitionen unter /Volumes eingehängt. Wenn du also z. B. eine Partition mit der Bezeichnung "mac" hast, ist alles, was du machen musst, nachsehen ob "/Volumes/mac/blabla.exe" existiert. Wenn du eine DVD "film" hast, musst du nachsehen, ob "/Volumes/film/blabla.exe" existiert. Sind alles normale Verzeichnisse. Können genau so gehandhabt und durchsucht werden wie normale Ordner. Völlig analog mit externen Festplatten, CD-Laufwerken, USB-Sticks oder sogar eingehängten Netzwerk-Freigaben. Alles was eingehängt und verwendbar ist, erscheint als Ordner unter /Volumes. Willst du alle verwendbare Geräte auflisten, musst du einfach nur die Ordner unter /Volumes auflisten.

    ah, sehr schön!
    Und wie könnte ich alle vorhandenen "Volumes" erstmal auflisten?
    Und dann vielleicht checken ob es ne Festplatte, Floppy oder CD-Rom Laufwerk ist?

    Danke im Voraus
    geneticZ



  • Also, ich würde ml sagen du lernst die API von jedem Betriebssystem, z.b WinAPI für Windows.

    Dann benutzt du alle Drei APIs, und unterscheidest diese im code mit #ifndef und #endif, dann läuft das Programm auf dem OS, auf welches du es auch compiliert hast! Dann Compilierst du das einmal auf alle drei Betriebssystemen und schon hast du es für alle 3, Mac, windoof und den fluguntauglichen Vogel!


Anmelden zum Antworten