Problem mit CopyFile & ShellExecute



  • Guten Abend,
    ich könnte ein wenig Hilfe gebrauchen.

    Ich versuche gerade ein kleines Programm zu programmieren, mit welchem ich Datein kopieren bzw Öffnen kann, mit dem Pfad der vom Anwender eingegeben wird.

    Die grobe Grundstruktur steht und die Idee wie ichs machen möchte ebenfalls, nun ist da nur noch das Problem mit Copyfile und ShellExecute.

    Eig. sollten die beiden Funktionen ja ganz leicht sein:

    CopyFile(Pafd der Datei, Pfad wo es hinsoll,FALSE);

    Mache ich dies aber kriege ich beim Kompilieren einen Fehlercode, obwohl sogar der Pfad zur Datei besteht. Ich habe google schon 100 mal befragt und auch andere Sachen versucht, aber jedesmal stolpert er über diesen Teil des Programmes.

    Genau das Selbe passiert mir bei ShellExecute.

    Weiß da eventuell jemand rat, wie ich es lösen könnte?

    Des Weiteren möchte ich es so Programmieren, dass, wie bereits oben gesagt, der Anwender den Pfad der zu kopierenden Datei vorher angibt und diese dann in CopyFile bzw ShellExecute übernommen wird, aber wie mach ich das dann mit den Variabeln, benutzte momentan dafür einen String.

    Ich hoffe man kann verstehen was ich möchte, bzw wo es hadert, wenn nicht einfach nachfragen 🙂

    Vielen dank Schon einmal

    Edit: Habe das Problem mit CopyFile gelöst, hatte #include <windows.h> vergessen....

    Aber wie schaffe ich das mit den Variabeln?



  • Ohne Code ist es normalerweise schwierig, hier tippe ich aber auf fehlende includes:

    #include <windows.h>
    #include <shellapi.h>
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du solltest deine Posts nicht so großflächig editieren (Rechtschreibfehler ausgenommen), lieber einen weiteren Post absetzen.

    Junker schrieb:

    Des Weiteren möchte ich es so Programmieren, dass, wie bereits oben gesagt, der Anwender den Pfad der zu kopierenden Datei vorher angibt und diese dann in CopyFile bzw ShellExecute übernommen wird, aber wie mach ich das dann mit den Variabeln, benutzte momentan dafür einen String.

    Klingt doch gut, wo ist das Problem?



  • Mal abgesehen davon, dass jetzt CopyFile funktioniert (WEHOOO) funktioniert ShellExecute immer noch nicht, obwohl ich es, wie in dem Thread unter mir beschrieben, übernommen habe.

    ShellExecute(NULL, "open", "HA.txt", NULL, path, SW_NORMAL );
    

    (Ha.txt liegt in dem Ordner in dem sich auch die main.c befindet)

    Ich poste am Besten einfach mal den Quellcode, damit ich es besser erläutern kann:

    #include <stdio.h>
    #include <stdlib.h>
    #define TRUE 1
    #define FALSE 0
    #include <windows.h>
    #include <shellapi.h>
    
    int main(int argc, char *argv[])
    {
    int Wahl;
    
    // Anschrift
    printf("Willkommen \n \n Mit Diesem Programm können sie beliebig viele Datein kopieren und/oder öffnen\n\n\n");
    jump:
    printf("Um Datein zu kopieren drücken Sie bitte die <1>!\n");
    printf("Um eine Datei zu öffnen drücken Sie bitte die <2>!\n");
    printf("Um das Programm zu beenden drücken Sie <3>!\n\n");
    printf("Eingabe:  ");
    scanf("%d",&Wahl);
    fflush(stdin);
    
    // If Befehl
    
    switch(Wahl)
    {
    case 1 : printf(" Sie haben KOPIEREN gewählt\n");
             printf("Geben Sie bitte den Pfad der Datei ein!\n");
    
             char Eingabe1[100];
             fgets(Eingabe1, 100, stdin);
             fflush(stdin);
             printf("Geben Sie bitte den Namen der Datei ein, den Sie kopieren möchten\n");
    
             char Eingabe11[100];
             fgets(Eingabe11, 100, stdin);
             fflush(stdin);
    
        //Kopieren     Anfang
    
    CopyFile("C:\\HA.txt","C:\\HA3.txt",TRUE);	
    
    //Kopieren Ende       
    break;
    

    Hier möchte ich die HA.txt durch die Eingabe des Anwenders ersetzen (Eingabe1) und eventuell auch den Ausgangsnamen durch eine weitere Eingabe ersetzen.

    case 2 : printf("Sie haben ÖFFNEN gewählt\n");
             printf("Geben Sie bitte den Namen der Datei ein, die Sie öffnen möchten\n");
             char Eingabe2[100];
             fgets(Eingabe2, 100, stdin);
             fflush(stdin);
    
             // Öffnen Anfang
            ShellExecute(NULL, "open", "HA.txt", NULL, path, SW_NORMAL );
    

    Hier möchte ich die HA.txt durch die Eingabe des Anwenders ersetzen (Eingabe2). Wenn es denn funktionieren würde.

    return 0;
    break;
    
    case 3 : 
    break;
    
    default: printf("Unbekannte Eingabe?!\n");
    goto jump;
    break;
    }
    system("PAUSE");
    return 0;
    }
    

    P.S.: Tut mir leid, werde mich das nächste Mal dran halten 🙂



  • Gib mal statt nur HA.txt den vollen Pfad an, bzw. wo setzt du path?



  • Path muss ich setzen? Wie gesagt, dass ist meiner ganzer Quellcode, hatte das von einem anderen Thread hier übernommen und da stand nichts weiter 🙂

    Des Weiteren, wenn ich bei

    CopyFile("C:\\HA.txt","C:\\HA3.txt",TRUE);
    

    C:\\HA.txt durch Eingabe11 ersetze, damit der Anwender die Datei auswählen kann, kommt zwar kein Fehlercode aber schlussendlich wird keine Datei kopiert.



  • fgets legt das Zeilenendezeichen von der Entertaste mit im String ab (Es ist ja ein gültiges Zeichen).
    Man kann das einfach löschen, indem man das Zeilenendezeichen ('\n') mit dem Stringendezeichen ('\0') überschreibt.

    fgets(Eingabe1, 100, stdin);
             if ( (strlen(Eingabe1) >0) && (Eingabe1[strlen(Eingabe1)-1] == '\n'))  // ist überhaupt eine Zeilenende vorhanden?
                Eingabe1[strlen(Eingabe1)-1] = '\0';    // dann überschreiben
    

    Ach nochwas: fflush(stdin); ist nicht Standardkonform. Hier findest du eine allgemein Lösung für das Problem: http://www.c-plusplus.net/forum/viewtopic.php?t=39349



  • Solche Probleme kann man rausfinden, indem man den Debugger benutzt oder Kontrollausgaben macht.

    printf("Kopiere von <%s> nach <%s>\n", Eingabe1, Eingabe11);
    

    Wenn da steht

    Kopiere von <C:\\HA.txt> nach <C:\\HA3.txt>
    

    ist alles in Ordnung.

    Steht da aber

    Kopiere von <C:\\HA.txt
    > nach <C:\\HA3.txt
    >
    

    , hast du den Zeilenvorschub mit in den Strings.



  • Super klappt alles ganz Prima jetzt, habe auch das Problem mit ShellExecute gelöst.
    Wollt mich nur noch einmal bei euch kurz bedanken für die schnell und hilfreiche Hilfe, find ich super, dass einem hier so bereitwillig geholfen wird 🙂


Anmelden zum Antworten