Probleme beim Recovery-CD programmieren



  • Also, ich habe mal dein kleines Programm eingegeben und getestet.
    Mit meinen beiden am weitesten entfernten Laufwerken, damit er richtig weit bewegen muss. Und habe absichtlich die Dateiendung im Ziel verändert, um zu sehen ob er auch das macht.
    Und es klappt einwandfrei. Datei als auch Inhalt wurden komplett bewegt und umbenannt.
    Es klappt allerdings nicht, wenn bereits eine Datei mit dem gleichen Zielnamen im Zielordner vorhanden ist. Ansonsten klappt es wunderbar.

    #include <stdio.h>
    #include <windows.h>
    
    main()
    {
        char sourcefile[81]="i:\\intel\\Notice.txt";   
        char targetfile[81]="c:\\juppijupp.dat";
    
        MoveFile(sourcefile, targetfile);
    
        return 0;
    }
    


  • Also das kapier ich jetzt net.

    Bei mir gehts grad auch mit dem kleinen Program. Da muss ich wohl morgen nochmal genauer suchen, warum es erst net geht und dann doch. Hatte das vor dem Posten extra nochmal überprüft, ob es nicht doch läuft. 😕

    Eben ist mir was eingefallen. Ich habe die Dateinamen nach dem Zählen der Dateien in einer Datei zwischengespeichert 💡 . Könnte es sein, dass meine Lesefunktion, die die Namen jeweils einzeln aus der Datei holt das '\n' Zeichen mitgelesen und dann später auch in den Dateipfad mit eingebaut hat?
    Sieht wohl so aus, als ob ich mich entschuldigen müsste. Der Fehler ist zwar an der erwarteten Stelle, aber nicht der Fehler, für den ich eine Lösung gesucht habe.
    Ich werde euch morgen mal den Code dazu posten, vielleicht habe ich ja auch noch einen anderen Fehler drin.

    Aber warum die Funktion die ganze Zeit nicht funktioniert hat und jetzt auf einmal doch, kann ich mir trotzdem nicht erklären.



  • Aber warum die Funktion die ganze Zeit nicht funktioniert hat und jetzt auf einmal doch, kann ich mir trotzdem nicht erklären.

    Weil DEIN Code die ganze Zeit Mist baut, und nicht "die Funktionen".



  • So. Es lag tatsächlich am new-line-Zeichen. Jetzt funktioniert auch meine CopyFile-Funktion wie sie soll.
    Da jetzt alles unter optimalen Bedingungen funktioniert, dürfte sich im Code erstmal kein Fehler mehr verstecken. Jetzt mache ich mich an die Sicherheitsvorkehrungen. Der folgende Code ist meine Zählfunktion:

    #include <dirent.h>
    #include <stdio.h>
    #include <windows.h>
    #define MAXENTRY 1024
    
    main()
    {
      DIR *myDir;
      FILE *temp_p;
      char *dirName;
      struct dirent *entry;
      char *dirNames[MAXENTRY];
      int i=0;
    
      dirName="d:\\test\\";
      temp_p=fopen ("c:\\tempfile.txt", "w");
        if (!(myDir=opendir(dirName)))
        {
          printf("Verzeichnis kann nicht geoeffnet werden\n");
          exit(1);
        }
      while (entry=readdir(myDir))
        {
          dirNames[i++]=strdup(entry->d_name);
          fprintf(temp_p, "%s\n", entry->d_name);
        }
      closedir(myDir);
      fclose(temp_p);
      return i;
    }
    

    Ich bräuchte eine Möglichkeit zwischen Verzeichnissen und Dateien zu unterscheiden, dass nur Dateinamen in die Temp-Datei geschrieben werden. Später kann ich damit dann die Funktion dann auch so umschreiben, dass sie rekursiv aufgerufen wird.
    Um den Zielpfad beim kopieren sicher zu stellen habe ich vor, die erste Datei auf den jeweiligen Zielpfad mithilfe einer Batchdatei zu kopieren. Dabei wurde bis jetzt immer der Zielpfad generiert.
    Die Char-Größen für Strings werde ich noch dynamisch allokieren, sobald ich das letzte Kapitel meines Tutorials durch habe.
    Danach ist das Thema kopieren durch.

    Als nächstes wäre dann das ausführen diverser Installationsprogramme zu erledigen. Wie kann ich Befehle an das Program weiter geben? z.b. ganz banal wenn mich das Installationsprogramm fragt, ob ich die Lizenzbedingungen annehme. Wie kann ich das über mein Programm bestätigen? Gibt es da eine Möglichkeit in C?

    Danke schonmal.

    Edit:
    OK, also dass die Sache mit den Installationsprogrammen in c nicht geht, habe ich eben herausgefunden. Da muss ich also nach einer anderen Möglichkeit suchen, aber die Zählfunktion würde ich trotzdem gerne noch verfeinern.
    Nimmt mir ja schonmal ein bischen Arbeit weg.



  • Mistil schrieb:

    Um den Zielpfad beim kopieren sicher zu stellen habe ich vor, die erste Datei auf den jeweiligen Zielpfad mithilfe einer Batchdatei zu kopieren.

    Oh Gott hilf!



  • Na hier bekomme ich ja hauptsächlich Kritik zu hören, also muss ich mit dem was ich habe nach Lösungen suchen.



  • 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