Datei kopieren zu Laufzeit = Fehler



  • probier erstmal feste parameter für CopyFile.



  • Feste Parameter sind kein Problem. Da geht es ja.



  • und wenn du dir das von GetCommandLine() ausgeben lässt? entspricht die ausgabe dem festen string?



  • Dutei schrieb:

    LPCTSTR pTo;
    

    Das ergab sich aus der MSDN. Versteh dich nicht ganz.
    pTo wird ja mit dem CString gefüllt.

    nein.
    naja, nur solange der string lebt.

    was zeigt der rechner denn an, wenn du machst

    CString strPath = GetCommandLine();
    strPath=">"+strPath+"<";//nur mal, um anfang und ende genau zu sehen
    MessageBox(...//den strPath mal anzeigen
    

    ? ist das genau der string, der als datenamen genommen werden soll?

    geht genau der string, wenn du ihn als festen string nimmst?

    was gibt denn bei dir folgendes programm aus?

    int main(){
       LPCTSTR pFrom;
       LPCTSTR pTo;
       CString strPath;
       strPath="sourceFile.txt";
       pFrom=strPath;
       strPath="destinationFile.txt";
       pTo=strPath;
       cout<<"from "<<pFrom<<endl;
       cout<<"to "<<pTo<<endl;
       if(strcmp(pFrom,pTo)==0)
          cout<<"houston, we have a problem!"<<endl;
       return 0;
    }
    

    wir können dir nicht direkt helfen, weil die anfrage nicht erlaubt, den fehler zu sehen. du zeigst nur code und sagst dazu, daß anderer code nicht geht. der andere hat vermutlich offensichtliche fehler, aber wie sehen ihn nicht.
    außerdem sollste eigentlich nicht mit CString spielen, du würdest schneller vorankommen, wenn du erstmal nur mit c++ auf der konsole spielen würdest. auch mal zeiger und verkettete listen. mal sortieren und ein text-adventure. du kommst nämlich in teufels küche, wenn du keinen guten stil hast und dann vor probleme mit der winapi läufst. wirst dir einen dermaßen schlechten stil angewöhnen, weil die lösungen, die du als einige findest (dabei gibt es 10 lösungen und du solltest die beste finden), nicht gut sind, aber du sie dir angewöhnst.



  • Hallo Volkard,
    also wenn ich den ersten Code von dir nehme steht in
    der MessageBox exakt der Pfad zu der zu kopierenden Datei
    im Debug bzw Realease-Ordner, inkl. EXEname.
    Geb ich den Inhalt fixiert in einem CString an

    CString strPath="c:\\meintest\\irgendwo\\blabla\\debug\\test.exe";
    

    Kann ich problemlos kopieren.

    Bei dem zweiten Code hat Houston eindeutig ein Problem
    from und to werden richtig angezeigt, nur lande ich am Ende
    dann doch in dieser Zeile:

    cout<<"houston, we have a problem!"<<endl;
    

    😮



  • int main(){
       LPCTSTR pFrom;
       LPCTSTR pTo;
       CString strPathFrom ="sourceFile.txt";
       pFrom=strPathFrom;
       CString strPathTo = "destinationFile.txt";
       pTo=strPathTo;
       cout<<"from "<<pFrom<<endl;
       cout<<"to "<<pTo<<endl;
       if(strcmp(pFrom,pTo)==0)
          cout<<"houston, we have a problem!"<<endl;
       return 0;
    }
    


  • Soll passieren...

    Ok jetzt bleib ich nicht mehr in der Zeile hängen.
    Aber eine Lösung kann ich daraus nicht wirklich ableiten ? 🙄



  • Dutei, so können wir dir nicht helfen. Wir sind keine Hellseher.



  • Ok, dann nochmal der aktuelle Beispielcode. Ich habe keine Ahnung was
    ich noch mehr zeigen soll. Aber evtl. bringt es ja etwas. Vielleicht
    ist ja da der Kinken irgendwo doch noch drinne.

    CString strPath = GetCommandLine(); //damit gehtes nicht
    //CString strPath="c:\\test\\xyz\\meine.exe"; //damit geht es
    MessageBox(strPath);//einmal anzeigen zur Kontrolle
    strPath+='\0';//Null anhängen laut MSDN
    
    CString to="c:\\testdatei.exe"; //hier soll es hinkopiert werden
    to+='\0'; //Null anhängen laut MSDN
    
    SHFILEOPSTRUCT foCopy; 
    
    foCopy.hwnd                  = NULL; // Handle
    foCopy.wFunc                 = FO_COPY; //operation kopieren wählen
    foCopy.pFrom                 = strPath; //von 
    foCopy.pTo                   = to; //nach
    foCopy.fFlags                = FOF_NOCONFIRMATION;
    foCopy.fAnyOperationsAborted = FALSE; 
    foCopy.hNameMappings         = NULL; 
    foCopy.lpszProgressTitle     = NULL; 
    if(SHFileOperation(&foCopy) == 0) { 
    MessageBox(strPath,"ok !!!");
    } 
    else { 
    	MessageBox(strPath,"nicht ok !!");
    //hier lande ich immer
    }
    

    Das Ergebnis ist die Meldung dass von der Quelle oder dem Quelldatenträger
    nicht gelesen werden kann. Es wird nichts kopiert.



  • Ich würde mir den string den GetCommandLine() zurückgibt einmal genauer ansehen. Denn wenn ich mir die MSDN docu ansehe dann dann lese ich daraus dass dir der gesammte Strimg zurückgegeben wird der normalerweise in den argv zu finden ist. Das würde aber bedeuten dass der String mit dem namen deiner .exe beginnt und dann wäre klar warum das kopieren nicht funktioniert.
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getcommandline.asp
    Kurt



  • So blöde kann es kommen.
    GetCommandLine liefer den Pfad in Anführungszeichen zurück!!
    Man muss diese natürlich löschen. Sonst wirds nix mit dem
    kopieren. -.- *ouch* War mir echt nicht aufgefallen.

    In tiefer Demut, ob eurer Zeit verschwendend, sich verneigend
    Dutei



  • Bei mir ist der Pfad den GetCommandLine zurückgibt in " eingeschlossen.

    "C:\MeinProgramm.exe"

    Also das sollte doch wohl alles sagen. Benutz GetModuleFileName.



  • Man muss diese natürlich löschen.

    Lieber nicht.


Anmelden zum Antworten