CreateDirectory Probleme



  • Moin,

    folgendes möchte ich Realisieren:

    #include <iostream>
    #include <string>
    #include <Windows.h>
    #include <fstream>
    using namespace std;
    
    int main(void){
    
    	string name, kuerzel, age, funktion;
    	string spath = "test\\"; // Ordner test bereits vorhanden
    	fstream save;
    
    	// Eingabe der Daten
    	cout << "Name: ";
    	getline(cin, name);
    	cout << "Kuerzel: ";
    	getline(cin, kuerzel);
    	cout << "Alter: ";
    	getline(cin, age);
    	cout << "Funktion: ";
    	getline(cin, funktion);
    
    	// Ordner [kuerzel] in test\ erstellen
    
    	// Abfrage ob der Ordner schon vorhanden ist
    	// Ordner [kuerzel] schon vorhanden -> Abfrage: Überschreiben? (y/n)
    	// Ordner [kuerzel] nicht vorhanden -> neu erstellen
    	CreateDirectory(" ", NULL);
    
    	// Daten in test[kuerzel]\ als .txt Datei abspeichern
    
    	spath += kuerzel;
    	spath += "\\";
    	spath += kuerzel;
    	spath += ".txt";
    	save.open(spath.c_str(), ios::out|ios::trunc);
    	if(save.is_open() != true){
    		cout << "\nFehler beim oeffnen der Datei!\n\n";
    		system("PAUSE");
    		exit(1);
    	}
    	save << "Name: " << name << endl
    		 << "Alter: " << age << endl
    		 << "Funktion: " << funktion << endl;
    	save.close();
    	cout << "\nDatei wurde erfolgreich erstellt\n\n";
    	system("PAUSE");
    	return 0;
    }
    

    Nur stelle ich jetzt fest, das ich überhaupt keinen Plan habe wie ich das mit CreateDirectory verwirklichen kann. Dazu muss ich sagen, ich habe mit CreateDirectory noch nie gearbeitet...



  • http://www.boost.org/doc/libs/1_44_0/libs/filesystem/v2/doc/index.htm

    Schöner zu benutzen und vor allem Platformunabhängig.
    Kann ich nur empfehlen.
    rya.


  • Administrator

    Und falls es doch nicht Boost sein soll, dann bist du im falschen Forum. CreateDirectory ist eine WinAPI Funktion. Wie man sie benutzt, steht alles in der Dokumentation.

    Grüssli



  • Aber für so eine Mini-Funktionalität würde ich mir nicht den Brocken boost einbinden wollen.

    Du kannst recht einfach prüfen, ob ein Ordner schon vorhanden ist:

    typedef std::basic_string<TCHAR> string_type; // thx Unskilled
    
    bool DirExists(const string_type& name)
    {
      WIN32_FIND_DATA data;
      HANDLE hdl=FindFirstFile(name.c_str(),&data);
      if(hdl==INVALID_HANDLE_VALUE)
        return false;
      FindClose(hdl);
      return true; // es sollte egal sein, ob name eine Datei oder Verzeichnis ist 
    }
    

    Das Problem ist nun, dass CreateDirectory mit bspw. d:\1\2\3 nur klappt, wenn d:\1\2 schon vorhanden ist.
    Man kann sich deshalb so etwas zusammenschustern:

    bool CreateDirectory(const string_type& name)
    {
      return(::CreateDirectory(name.c_str(),0)!=0);
    }
    bool CreatePath(const string_type& name)
    {
      if(CreateDirectory(name))
        return(true);
      size_t pos = name.rfind(TEXT("\\"));
      if(pos!=string_type::npos)
      {
        if(!CreatePath(name.substr(0,pos)))
          return false;
        return(CreateDirectory(name));
      }
      return(false);
    }
    

    Es wird also rekursiv CreatePath aufgerufen, was bei der zu erwartenden geringen Anzahl kein Problem sein dürfte.
    Jetzt sollte Folgendes klappen:

    bool CreateDir(const string_type& name)
    {
      if(!DirExists(name))
      {  if(!CreatePath(name))
           return false;
      }
      return true;
    }
    bool f()
    {
      string_type str("d:\\");
      str+="1\\";
      str+="2\\";
      str+="3\\";
      str+="4\\";
      str+="5\\";
      str+="6";
      return CreateDir(str);
    }
    


  • Wieso Brocken?
    Es ist nur eine Library innerhalb des riesen Pakets. Und boost hat so gut wie jeder aufm Rechner der C++ programmiert^^.
    Und das sage ich als jemand der boost nur sehr selten empfiehlt. Aber in dem Fall zurecht.
    rya.



  • Davon abgesehen das CreateDirectory nicht in das ANSI C++ Unterforum gehört, es gibt ein eigenes Unterforum für die WindowsAPI.



  • Blacky666 schrieb:

    // Abfrage ob der Ordner schon vorhanden ist
    // ..
    CreateDirectory(" ", NULL);
    

    ..ich habe mit CreateDirectory noch nie gearbeitet...

    Zwei ganz einfache Probleme.

    Scorcher24 schrieb:

    <Boostempfehlung>rya.

    Okay, es ist nur eine kleine Bibiothek, aber sollte man sich, wenn man programmiert, nicht mit diesen einfachen Konzepten vertraut machen?

    Dravere schrieb:

    .. CreateDirectory ist eine WinAPI Funktion. Wie man sie benutzt, steht alles in der Dokumentation.

    Dass ein Link zur MSDN-Dokumentation nicht unbedingt zum Ziel führt, dürfte nach Codeansicht auch klar sein...

    asc schrieb:

    Davon abgesehen das CreateDirectory nicht in das ANSI C++ Unterforum gehört, es gibt ein eigenes Unterforum für die WindowsAPI.

    Ja und jetzt?



  • Danke für euere Hilfe. Jetzt muss ich erstmal durch die ganzen Codes durcharbeiten, sodas ich diese erstmal richtig verstehe. 🙂


Anmelden zum Antworten