Überprüfen, ob es sich um eine File oder Pfad handelt



  • Wenns boost sein darf, würd ich mal da rein schauen: http://www.boost.org/libs/filesystem/doc/index.htm

    Ansonsten kriegstes nur plattformabhängig hin, also in POSIX:

    struct stat path_stats;
    
    stat("/home/foo", &path_stats);
    if(S_ISDIR(path_stats.st_mode)) {
      puts("Verzeichnis! Yay!");
    }
    

    Unter Windows gabs da diesen FindFirstFile-Kram...wenn ich mich recht entsinne, etwa so:

    HANDLE h;
    WIN32_FIND_DATA wfd;
    
    h = FindFirstFile(_T("C:\foo"), &wfd);
    if(h != INVALID_HANDLE_VALUE &&
       wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
      puts("Verzeichnis! Yay!");
      FindClose(h);
    }
    

    ...oder so ähnlich.



  • Leider klappt auch das nicht. Ich versteh´s nicht. Hat jemand noch ne Idee *seufz*???

    Ich hab derzeit:

    HANDLE h;
    WIN32_FIND_DATA FindFileData;
    DWORD tester = GetFileAttributes(path);

    h = FindFirstFile(path,&FindFileData);

    cout << "hm:" << hm << endl;

    if (tester == FILE_ATTRIBUTE_DIRECTORY && FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    cout<<"directory" << endl;
    }
    else cout<<"file" << endl;

    Aber ich krieg immer "file". Auch mit dem oben geposteten Code krieg ich kein Ergebnis. VERZWEIFLUNG!!!!



  • Wenn ich mir die Doku zu GetFileAttributes so ankucke, scheint das ne Bitmaske zu sein, mit == kommste da also nicht weiter. Versuch mal

    if(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY) {
      std::cout << "Verzeichnis" << std::endl;
    } else {
      std::cout << "Datei" << std::endl;
    }
    


  • Mit FindFirstFile bzw. GetFileAttributes wird aber wie gesagt C:\\foo\\ nicht als Verzeichnis angesehen.



  • Ähm, danke, aber das hab ich bereits in meinem Code stehen und es geht nicht.



  • Ich hab auch noch folgendes versucht:

    struct _finddata_t c_file;
    long hFile = _findfirst (path,&c_file);
    cout << (c_file.attrib & _A_NORMAL)<<endl;
    if (c_file.attrib & _A_SUBDIR)
    {
    cout << "directory" << endl;
    }
    else
    {
    cout << "file" << endl;
    }

    Aber auch hier krieg ich nur "file" zurück 😡

    Schön langsam drängt sich mir der Verdacht auf, dass es nicht möglich ist etwas ähnliches wie die isFile() von Java in C++ zu implementieren. Das wär dann echt traurig 😞



  • Du hast in deinem Code == drin stehen, was bei einer Bitmaske herzlich wenig bringt.

    Wie dem auch sei, ich hab mal in altem Code rumgewühlt, was auf jeden Fall geht, ist etwas in der Art:

    h = FindFirstFile(subdir + "*.*", &wfd);
    do {
      if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
        // Verzeichnis
      } else {
        // Datei
      }
    } while(FindNextFile(h, &wfd));
    FindClose(h);
    

    Das Ding iteriert durch ein Verzeichnis durch und behandelt Verzeichnisse anders als Dateien - ich habs damals gebraucht, um ein Verzeichnis rekursiv zu durchlaufen, und von diesem Code weiß ich, dass er läuft. Ihn für deine Zwecke anzupassen, sollte trivial sein.



  • BTW, eigentlich gehört der Thread inzwischen ins WinAPI-Forum, oder?



  • > Sorry hilft doch nicht.  
    >   
    > C:\\Programme\  
    >   
    > also mit Backslash hinten dran wird nicht als Verzeichnis erkannt. Nur ohne Backslash.
    
    dann kick doch den letzten "\\"  
    ist das so schwer?  
    
    ```cpp
    string eingabe;
    string::iterator i=eingabe.end()-1;//oder irgendeine andere sache, die vielleicht nicht so holprig ist^^ bin müde^^
    if(*i=='\\'){
        eingabe.erase(i);
    }
    ```
    
    und fertich-.-


  • Ich wollte nur keine Lösung schuldig bleiben. Ich hab´s noch hingekriegt mit folgender Lösung. Das mit "\nul" war richtig, danke! Jetzt läufts:

    try
    {
    string name(__argv[1]);

    ifstream iff(name.c_str());
    if (iff)
    {
    MessageBox(NULL,
    "The choosen path\n"+path+"\nis a file!",
    "Scant_2_CSV - Path is file",
    MB_ICONERROR | MB_OK);
    exit(1);
    }
    else
    {
    ifstream ifn(string(name + "\\nul").c_str());
    if (ifn)
    {
    cout << "PATH CORRECT" << endl;
    }
    else
    {
    MessageBox(NULL,
    "Unknown fatal error",
    "Scant_2_CSV - Fatal path error",
    MB_ICONERROR | MB_OK);
    exit(1);
    }
    }
    }
    catch(int) // ,das dann hier gefangen wird, aber mit Bier ging's so besser
    {
    MessageBox(NULL,
    "Unknown fatal error",
    "Scant_2_CSV - Fatal path error",
    MB_ICONERROR | MB_OK);
    exit(1);
    }


Anmelden zum Antworten