Probleme beim Recovery-CD programmieren



  • Zerleg den Pfad in Laufwerk, Verzeichnis, Verzeichnis ... Verzeichnis, Dateiname, und leg dann in einer Schleife alle Verzeichnisse an.

    Das geht in C, ganz ohne Batchfiles.

    Eine relativ einfache Möglichkeit das zu machen wäre:

    void CreateDirectories(char const* path, bool isDirectory);
    void CreateDirectoriesImpl(char* path, bool isDirectory);
    
    void CreateDirectories(char const* path, bool isDirectory)
    {
        // string sicherheitshalber kopieren, wir werden den nämlich modifizieren
        char* pathCopy = malloc(strlen(path) + 1);
        strcpy(pathCopy, path);
    
        CreateDirectoriesImpl(pathCopy, isDirectory);
    
        free(pathCopy);
    }
    
    void CreateDirectoriesImpl(char* path, bool isDirectory)
    {
        int pos = finde_letzten_slash_oder_backslash(path);
        if (pos != nix_gefunden)
        {
            char backup = path[pos]; // backup des slash/backslash machen
            path[pos] = 0; // alles wegschneiden was nach dem letzten slash/backslash kommt (inklusive)
            // wir rufen uns selbst rekursiv auf um alle verzeichnisse VOR "unserem pfad" anzulegen
            CreateDirectoriesImpl(path, true);
            // slash oder backslash wiederherstellen
            path[pos] = backup;
            // wenn "unser" ungekürzter pfad ein verzeichnis war, muss das auch noch angelegt werden
            if (isDirectory)
                ::CreateDirectoryA(path, 0);
        }
    }
    
    void Foo()
    {
        char const* sourcePath = "c:\\test.txt";
        char const* destPath = "c:\\foo\\bar\\baz\\qux\\quux\\test.txt";
    
        CreateDirectories(destPath, false);
        CopyFile(sourcePath, destPath, true);
    }
    


  • Das is doch mal ne Antwort. Danke dir.

    Ich dachte, es würde vielleicht einen Fehler oder so geben, wenn ich einen Ordner anlegen möchte, der schon existiert. Deswegen wollte ich das nicht ohne vorhergehende Prüfung machen. Da ich aber nicht wusste, wie ich einen Pfad auf existenz prüfe, wollte ich mir anderst aus der Patsche helfen.

    Danke dir. Ich werde morgen gleich mal versuchen, das in meinen Code mit einzubauen. 🙂



  • So, ich habe mir mal die Mühe gemacht für dich die Win-Api File und Directory Funktionen rauszusuchen.
    Da gibt es schöne Übersichten bei MSDN:

    Hier die Directory Managment Funktionen:

    http://msdn.microsoft.com/en-us/library/aa363950

    Und hier die File Mangament Funktionen:

    http://msdn.microsoft.com/en-us/library/aa364232

    Da sind schon einige interessante Sachen bei, die du bestimmt auch nutzen könntest.

    Gruß,
    DC



  • Ich dachte, es würde vielleicht einen Fehler oder so geben, wenn ich einen Ordner anlegen möchte, der schon existiert. Deswegen wollte ich das nicht ohne vorhergehende Prüfung machen.

    BOOL WINAPI CreateDirectory(
    __in LPCTSTR lpPathName,
    __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );

    Return code

    ERROR_ALREADY_EXISTS The specified directory already exists.

    ERROR_PATH_NOT_FOUND One or more intermediate directories do not exist; this function will only create the final directory in the path.

    // Create a new directory. 
    
       if (!CreateDirectory("Testdir", NULL)) 
       { 
          printf("CreateDirectory failed (%d)\n", GetLastError()); 
          return -1; 
       }
    


  • Mistil schrieb:

    Ich dachte, es würde vielleicht einen Fehler oder so geben, wenn ich einen Ordner anlegen möchte, der schon existiert.

    Gibt es auch, aber keinen schlimmen, d.h. den kann man ignorieren.

    Deswegen wollte ich das nicht ohne vorhergehende Prüfung machen. Da ich aber nicht wusste, wie ich einen Pfad auf existenz prüfe, wollte ich mir anderst aus der Patsche helfen.

    Prüfen kann man sowas mit GetFileAttributes (schlag es in der MSDN nach). Damit bekommst du nicht nur raus ob ein Pfad existiert, sondern auch ob es ein Verzeichnis ist und ein paar andere Dinge.


Anmelden zum Antworten