Feststellen ob Datei oder Verzeichnis

inu

Grünschnabel
Hallo Leute,

wie kann ich feststellen (C++ - nicht .NET), ob es sich bei einem übergebenen String um eine Datei oder um ein Verzeichnis handelt?

Sollte es sich um ein Verzeichnis handeln, benötige ich daraus alle Datei und Unterverzeichnisse.

Ich benutze MS Visual Studio 2005 Express.

Vielen Dank
 
Hallöle,

also ich hab das jetzt auch schon ein paar mal benötigt und ahb dazu das hier gefunden
bzw wurde mir dazu gezeigt :D


C++:
#include "stdafx.h"


#include <iostream>
#include <fstream.h>
#include <windows.h>


int main()
{   

char *pszPath="c:\\*";

HANDLE fHandle;										//für das Durchsuchen nach Dateien ein FileHandler
WIN32_FIND_DATA wfd;								   //Find Data Objekt
								

fHandle=FindFirstFile(pszPath,&wfd);			//erste File finden

 
do 
{ 
   // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert) 
   // hier könnte man z.B. auch mit lstrcmp auf . und .. vergleichen, was allerdings nicht ganz so effizient ist 
   if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
   { 
      if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)		//wenn es ein Ordner ist 
      { 
         cout<<"Unterverzeichniss: "<<wfd.cFileName<<endl;
      } 
      else														//wenn es allerdings um eine Datei handelt 
      {  
         
         cout<<"Datei: "<<wfd.cFileName<<endl;
         
      }
      
   }  
} while (FindNextFile(fHandle,&wfd));									//wenn keine Dateien mehr im Ordner sind
FindClose(fHandle);

    return 0;
}

Das einzig blöde ist das die Fkt ein * am Ende benötigt das kannst ja mit strcat anfügen bevor es in den handler schmeisst, wenn der angegebene String ne Datei ist passiert einfach nix weil Handle dann false liefert.. könntest ja auch noch abfangen wenn ne Ausgabe willst obs ne Datei oder en VZ war

hoffe es Hilft


greets sand13r
 
Danke, zumindest komme ich damit ein Stück weiter.

Wie aber jedoch kann ich feststellen, ob es sich bei einem an eine Funktion übergebener String um ein Verzeichnis oder um eine Datei handelt?

Vielen Dank
 
Hiho,

hab mal ausprobiert und es müsste so gehen

C++:
 if(FILE_ATTRIBUTE_DIRECTORY==wfd.dwFileAttributes)
   {
      cout<<"\nVerzeichnis\n";
   
   }else{
   
   cout<<"\nDatei\n";
   }

also praktisch geanu das was im oberen Text in der if...else steht ich hab die Ausgabe da nur gemacht um es dir zu zeigen das er bei einem Vz dareinspringt und bei einer Datei da.. also anstatt dem "cout<<Datei..." machst einfach das was du machen willst wenn es eine Datei ist oder eben ein Verzeichnis ist


hoffe es hilft


greetz sand13r
 
Hallo,

ich versuch mal meinen Wunsch zu verdeutlichen:

Ein Benutzer gibt eine Zeichenkette ein. Nennen wir die Variable "verzeichnisoderdatei". Diese Variable soll an eine Funkion übergeben werden. Diese nennen wir mal "StellefestObDateioderVerzeichnis". Als Ergebnis soll ein "TRUE" oder "FALSE" zurückgegeben werden:

boolean StellefestObDateioderVerzeichnis (verzeichnisoderdatei)
{ ...
return "TRUE" oder "FALSE"
}

Sofern es sich um ein Verzeichnis handelt, benötige ich alle Dateien daraus. Wie das jedoch geht, habt ihr mir ja schon gezeigt...

Vielen Dank für die weitere Hilfe.
 
Hiho,

hab mal ausprobiert und es müsste so gehen

C++:
 if(FILE_ATTRIBUTE_DIRECTORY==wfd.dwFileAttributes)
   {
      cout<<"\nVerzeichnis\n";
   
   }else{
   
   cout<<"\nDatei\n";
   }

also praktisch geanu das was im oberen Text in der if...else steht
Ja, genau. Es sollte das sein was im obigen Beitrag in der Bedingung steht. Ein Verzeichnis/eine Datei kann mehrere Attribute haben. So wie es hier steht gibst du z.B. für versteckte Verzeichnisse auch "Datei" aus.

ich versuch mal meinen Wunsch zu verdeutlichen:

Ein Benutzer gibt eine Zeichenkette ein. Nennen wir die Variable "verzeichnisoderdatei". Diese Variable soll an eine Funkion übergeben werden. Diese nennen wir mal "StellefestObDateioderVerzeichnis". Als Ergebnis soll ein "TRUE" oder "FALSE" zurückgegeben werden:
Mit den gegebenen Informationen solltest du leicht diese Funktion selbst schreiben können.

Du mußt doch nur einmal FindFirstFile aufrufen, feststellen ob es ein Verzeichnis ist, das File Handle wieder freigeben und je nachdem true oder false zurückgeben.

Gruß
 
Zurück