Probleme beim Recovery-CD programmieren



  • Als erstes mal ein frohes neues Jahr euch allen. Ich hoffe, ihr seid gut rein gerutscht. 😃

    @Wutz:
    Ich will ja garnicht sagen, dass die Funktion einen Fehler hat. Aber wie in meinen ersten Posts schon gesagt habe ich das Problem, dass die Funktion "so wie ich sie eingebaut habe" nicht funktioniert. Genau so, wie ich den Fehler in der übergabe der Pfade an die Funktion vermute (wie gesagt, wenn ich String-Konstanten angebe, geht es). Daher meine ich den Fehler lokalisiert zu haben (die Returnwerte, die ich mir anzeigen lasse, sind auch die, welche ich erwarte) und frage mich, warum ich weiter suchen soll. Um den Fehler zu beseitigen suche ich (wie auch schon am anfang geschrieben) nach einer möglichkeit der Funktion meine Stringvariablen so zu übergeben, dass sie läuft oder nach einer anderen Funktion die die Variablen akzeptiert.

    hustbaer schrieb:

    ...
    Davon abgesehen.

    1. Du solltest lernen etwas selbständiger zu sein. Bevor du das nächste mal fragst was X ist bitte gib einfach X in Google ein und drücke auf "Suchen". Herauszufinden was z.B. std::string ist, sollte weniger als eine Minute in Anspruch nehmen.

    2. Ich sehe zwei sinnvolle Möglichkeiten: such dir eine andere Sprache aus oder überleg dir ein anderes Projekt. C ist für das was du beschrieben hast IMO das falsche Werkzeug, da wären eher noch Batchfiles gefragt.

    1. ich bin des Googelns durchaus mächtig. Ich habe tatsächlich innerhalb weniger minuten herausgefunden was std::string im zusammenhang mit c++ ist. Da es hier aber um c ging und du garantiert mehr darüber weist als ich (sonst wären die Rollen hier wohl vertauscht) habe ich dich gefragt, weil ich nicht herausfinden konnte, was std::string in verbindung mit c zu bedeuten hat.

    2. Ich finde es schade, dass ich mit c keine Programme schreiben kann, die Dateien kopieren. Aber Danke für den Tip. Ich habe mein Program jetzt so verändert, dass es den eigentlichen Kopiervorgang an eine Batch-Datei weitergibt. Das kopieren dauert jetzt zwar etwas länger, aber immerhin funktioniert es jetzt.

    trotzdem wäre ich immernoch dankbar, wenn mir einer einen Tipp geben könnte, wie ich mein kleines gepostetes "Beispiel-"Program zum laufen bringe (unter optimalen Vorraussetzungen, sprich zielverzeichniss und quelldatei vorhanden...), damit das Kopieren schneller geht.



  • 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