Kopieren mit CopyFile. Ersetzen klappt nicht.
-
Hallo,
könnt ihr mir sagen, wie ich ein File c++ kopiere?
Ich habe es mit CopyFile versucht, aber er ersetzt keine Files, wenn diese schon vorhanden sind, obwohl sich die Quelldatei verändert hat.#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { //Kopiert das File CopyFile("c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.xls",true); system("PAUSE"); return EXIT_SUCCESS; }Besten Dank
Rahan
-
Was macht denn wohl das true, was du als letzten Parameter angegeben hast?Ich habe die Funktion noch nie vorher gesehen und trotzdem hatte ich dies nach 10 Sekunden rausgefunden. Ist Google so schwer zu bedienen?
-
Da wärst Du wohl im WinAPI-Forum besser aufgehoben. Schau Dir mal ReplaceFile an. Du kannst nicht davon ausgehen, dass die WinAPI-Funktionen genau das Verhalten vom Explorer nachbilden. Der fragt immerhin i.d.R. ob er ersetzen soll.
-
-
SeppJ schrieb:
Was macht denn wohl das true, was du als letzten Parameter angegeben hast?Ich habe die Funktion noch nie vorher gesehen und trotzdem hatte ich dies nach 10 Sekunden rausgefunden. Ist Google so schwer zu bedienen?
Junge, junge! Frech werdende Möchtegerne hab ich ja am liebsten!
Natürlich hab ich google bzw http://www.forestle.org gefragt. Und natürlich hab ich auch die API gelesen. Aber was soll ich sagen, ausprobiert hast du es wohl nicht. Egal was die API sagt, es funktioniert auch mit false nicht. Er ersetzt es einfach nicht.Mit
WINAPI ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls");klappt es jedenfalls wunderbar. Auch wenn die Datei voher nicht exisierte.
Ich hätte ja gern noch gefragt, ob man voher mit einer Checksumme oder ähnlichen vergleichen könnte, ob zwei Datein sich unterscheiden und dann erst zu kopieren. Aber hier trau ich mich das nicht.
Gruß Rahan
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ 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.
-
rahan schrieb:
Mit
WINAPI ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls");klappt es jedenfalls wunderbar. Auch wenn die Datei voher nicht exisierte.
Gruß Rahan
Ich muss mich verbessern. Es klappt gar nicht mehr, komisch.
Bekomme die Fehlermeldung:expected primary-expression before "__attribute__"
Keine Ahnung was der von mir will. Hab auch schon alle Parameter ausgefüllt von WINAPI ReplaceFile.
Vielleicht darf ich das so nicht schreiben?
Gruß Rahan
-
Zeig uns Code.... die Kristallkugeln in diesem Forum sind rar...
-
rahan schrieb:
Natürlich hab ich google bzw http://www.forestle.org gefragt. Und natürlich hab ich auch die API gelesen. Aber was soll ich sagen, ausprobiert hast du es wohl nicht. Egal was die API sagt, es funktioniert auch mit false nicht.
Und warum teilst du uns nicht mit, dass du diesen Parameter schon ausprobiert hast? Ist doch kein Wunder, dass jemand in die Doku schaut, um dir zu helfen, und dann direkt den Parameter als höchstwahrscheinliche Lösung deines Problems findet. Wenn du nach Hilfe fragst, solltest du schon den ganzen Sachverhalt hier schildern. Nachvollziehbar, oder?
-
Ähm, das WINAPI vor deinem Aufruf muss natürlich weg! Das ist der Typ des Rückgabewerts der Funktion, den schreibt man nicht beim Aufruf vorne hin...

EDIT: Ist natürlich nicht der Rückgabetyp, sondern die calling convention, aber egal...
-
Martin Richter schrieb:
Zeig uns Code.... die Kristallkugeln in diesem Forum sind rar...
Der Code der den Fehler beim Kopilieren erscheinen lässt lautet:
#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { //Kopiert das File WINAPI ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.bak"); system("PAUSE"); return EXIT_SUCCESS; }
-
Habe dir schon geantwortet, schau mal einen Post vorher...
-
_matze schrieb:
Ähm, das WINAPI vor deinem Aufruf muss natürlich weg! Das ist der Typ des Rückgabewerts der Funktion, den schreibt man nicht beim Aufruf vorne hin...
Ja so was hab ich mir schon gedacht. Sorry, bin kein c Programmierer und hab es auch nicht vor zu werden. Ich muss nur eine Exe erstellen die eine bestimmte Datei vom Server kopiert. Und hab da so meine Problemchen, wie dieses wenn ich die ReplaceFile Methode benutzen möchte.
`ReplaceFile' undeclared (first use this function)
Muss ich da noch irgendwas includen oder warum kennt er die Funktion nicht?
Vielen Dank
Rahan
-
Außer windows.h musst du nichts inkludieren. Zeig doch am besten noch mal den kompletten, aktuellen Code.
-
Hier hat die Funktion ein paar Parameter mehr:
http://msdn.microsoft.com/en-us/library/aa365512(VS.85).aspxWenn du bloss ne Datei kopieren willst, sollte CopyFile doch reichen?
http://msdn.microsoft.com/en-us/library/aa363851(VS.85).aspxWenn CopyFile() fehl schlägt, sollte der Rückgabewert false sein, und GetLastError() dürfte den Grund verraten?
-
geeky schrieb:
Wenn du bloss ne Datei kopieren willst, sollte CopyFile doch reichen?
Tja, leider kopiert mir CopyFile nicht die Datei, wenn sie schon vorhanden ist.
Alternativ könnte ich sie ja vorher löschen. Möchte ich aber nicht unbedingt.Hier immer noch mein aktueller Code:
#include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { //Kopiert das File ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.bak"); system("PAUSE"); return EXIT_SUCCESS; }Sagt er die Methode ist undeclared, weil sie nich alle Parameter hat?
Hat diese nun 4 oder 6 Parameter?
hab es auch schon mit diesem Versucht:ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.bak",REPLACEFILE_WRITE_THROUGH); //Kennt er REPLACEFILE_WRITE_THROUGH nicht ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.bak",0x00000001); //Funzt auch nicht ReplaceFile("c:\\temp\\t2\\test.xls","c:\\temp\\t1\\test.xls","c:\\temp\\t2\\test.bak",0x00000001,,); //Funzt auch nichtWie denn nun?
-
rahan schrieb:
geeky schrieb:
Wenn du bloss ne Datei kopieren willst, sollte CopyFile doch reichen?
Tja, leider kopiert mir CopyFile nicht die Datei, wenn sie schon vorhanden ist.
Wenn man den dritten Parameter auf false setzt tut sie das wohl:
"If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds."Wenn das doch trotzdem fehlschlägt, wird false zurückgeliefert und GetLastError() sagt näheres...
ReplaceFile() hat laut msdn 6 Parameter, die auch alle gesetzt werden müssen.
"Reserved"/"Optional" heisst in der msdn-doku meistens, dass man NULL bzw. 0 für den Parameter angeben sollte...
-
Da ich genauso wenig glauben konnte, was du hier erzählst, habe ich es gerade mal ausprobiert. Und selbstverständlich verhält sich CopyFile wie beschrieben und überschreibt bereits existierende Dateien, wenn der dritte Parameter FALSE ist.
BOOL b=CopyFile("C:\\test.txt","C:\\test_rgne.txt",FALSE); b=CopyFile("C:\\test.txt","C:\\test_rgne.txt",FALSE);Probier dieses Beispiel bitte mal bei dir aus. Wenn das nicht klappt, dann muss halt mit GetLastError geklärt werden, warum.
-
rahan schrieb:
Sorry, bin kein c Programmierer und hab es auch nicht vor zu werden. Ich muss nur eine Exe erstellen die eine bestimmte Datei vom Server kopiert.
Was spricht gegen ein einfaches Shell-Script? Für so etwas würde ich doch keinen Compiler anschmeißen.
-
_matze schrieb:
Da ich genauso wenig glauben konnte, was du hier erzählst, habe ich es gerade mal ausprobiert. Und selbstverständlich verhält sich CopyFile wie beschrieben und überschreibt bereits existierende Dateien, wenn der dritte Parameter FALSE ist.
BOOL b=CopyFile("C:\\test.txt","C:\\test_rgne.txt",FALSE); b=CopyFile("C:\\test.txt","C:\\test_rgne.txt",FALSE);.
Hey _matze,
ich versteh die Welt nicht mehr. Ich habe es heute morgen dauernd ausprobiert.
Mal mit false mal mit 0 mal mit -1. Es hat nie funktioniert.
Jetzt auf einmal funtz es wunderbar. Muss ich nicht verstehn. (FALSE ist doch das selbe wie false oder?)Naja vielen Dank nochmal und sorry, dass ich euch so verrückt gemacht habe.
Gruß Rahan