CopyFile
-
Hallo
Über ein Button will eich meine Einstellungen exportieren, d.h. einfach meine Einstellungen.ini kopieren und irgendwo speichern. Hab auch hingekriegt:
CopyFile(quelle,ziel,true);
Das Problem ist es, wenn ich erneut auf den Button klicke passiert nichts, Programm öffne, schließe -> funktioniert, aber wiederum nur ein Mal
Muss ich CopyFile() irgendwie schließen oder so???
Bin für jeden Tipp sehr dankbar!!!
-
Servus,
BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);Parameters
lpExistingFileName
[in] Pointer to a null-terminated string that specifies the name of an existing file.
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\?\" to the path. For more information, see Naming a File.Windows Me/98/95: This string must not exceed MAX_PATH characters.
lpNewFileName
[in] Pointer to a null-terminated string that specifies the name of the new file.
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\?\" to the path. For more information, see Naming a File.Windows Me/98/95: This string must not exceed MAX_PATH characters.
**
bFailIfExists
[in] If this parameter is TRUE and the new file specified by lpNewFileName already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.**Du musst den letzten Parameter auf False setzen damit er die bereits kopierte Datei wieder überschreibt.
*winke*
Hellsgore
-
Morgen.
Danke fürs Antwort. Mein Problem liegt wo anders, habe wahrscheinlich nicht richtig beschrieben...
Müsste eingentlich alles richtig sein, funzt auch. Zieldatei bekommt auch jedesmal neue Name. Wenn ich das CopyFile wo anders im Programm oder selbe Funktion nochmals ausführe dann funktioniert es nicht mehr.
CopyFile funktioniert nur einmal pro Programmstart!!!! Das ist mein Problem, muss ich irgendwie CopyFile schliessen???
void CSucheSoftwareDlg::OnSpeichernFehlerprotokollTxt()
{
CString quelle,ziel;
quelle=AktPfadFinden()+"\\Data\\Fehlerprotokoll.txt";
int i=0;
// Zeig einen "Speichern unter" Dialog
CFileDialog file( FALSE, //TRUE öffnen, False speichern
NULL,
NULL,
OFN_OVERWRITEPROMPT |
FN_PATHMUSTEXIST, //OFN_ENABLESIZING|OFN_OVERWRITEPROMPT,
"*txt|*.txt|"
);if (file.DoModal() == IDOK)
{
ziel=file.GetPathName(); //Vollständige Dateipfad inkl. .iniif(ziel.Find(".txt")==(-1))//auch Endung .ini eingegeben oder nur Filename???
ziel+=".txt";i=CopyFile((LPCTSTR)quelle,(LPCTSTR)ziel,true);
}if(i)
MessageBox("Fehlerprotokoll wurde unter:\n" + ziel+"\ngespeichert.");
else
MessageBox("Fehlerprotokoll konnte nicht gespeichert werden.",0,48);}
-
Servus,
mach mal das:
if (file.DoModal() == IDOK) { ziel=file.GetPathName(); //Vollständige Dateipfad inkl. .ini if(ziel.Find(".txt")==(-1))//auch Endung .ini eingegeben oder nur Filename??? ziel+=".txt"; i=CopyFile((LPCTSTR)quelle,(LPCTSTR)ziel,true); DWORD dwError = GetLastError(); //<<<--------------------------------- } if(i) MessageBox("Fehlerprotokoll wurde unter:\n" + ziel+"\ngespeichert."); else MessageBox("Fehlerprotokoll konnte nicht gespeichert werden.",0,48); }Führe das mal zweimal aus und gucke mal was in dwError steht und geb uns das mal. Dann sieht man ja normalerweise was für ein Fehler entsteht. Einfach mal durchdebuggen.
*winke*
Hellsgore
-
ich bekomme erst 0, dann 3...
was bedeutet das?i=CopyFile((LPCTSTR)quelle,(LPCTSTR)ziel,true); DWORD dwError = GetLastError(); //<<<--------------------------------- CString h; h.Format("%d",dwError); MessageBox(h);
-
Servus,
wenn du solche Sachen hast kannst du immer schön mit einem GetLastError() arbeiten. Dann guckst du in der Hilfe nach unter SystemErrorCodes findest du z.B. bei GetLastError und dann steht da:
3 The system cannot find the path specified. ERROR_PATH_NOT_FOUND
Überprüfe mal ob bei deinem zweiten durchlauf die beiden Pfadangaben noch stimmen oder ob sie garnicht mehr vorhanden sind.
*winke*
Hellsgore
-
Hi
Danke, Danke
Ich habs, Pfad hat nicht mehr gestimmt...
AktPfadFinden() funzt nicht so wie ich dachte, rufe jetzt diese Funktion nur beim Programmstart auf und speichere Ergebnis in eine Variable....
Danke für deine Hilfe, Hellsgore!!!

CString CSucheSoftwareDlg::AktPfadFinden(void) { TCHAR DirPuffer[MAX_PATH]; // Puffer für Verzeichnisname generieren ::GetCurrentDirectory(MAX_PATH, DirPuffer); // aktuelles Directory abfragen und speichern CString Path = DirPuffer; return(Path); }
-
Kein Prob
aber wenn du das Verzeichnis der Exe haben möchtest kannst du auch://Pfad nehmen in der die Exe ausgeführt wird CString strPath = GetCommandLine();// Pfad + Name der Exe holen int pos = strPath.ReverseFind( '\\'); // letztes '\' finden strPath = strPath.Mid(1, pos-1); // Name der Exe abtrennen, so dass nur noch der Pfad übrig bleibtbenutzen dann steht in strPath immer der Pfad der Exe drin. Der Code ist hier aus dem Forum. Das kannst du immer aufrufen und bekommst den Aktuellen Pfad der Exe. Kannst es aber auch so lassen wie du das hast.
*winke*
Hellsgore
-
Danke für den Tipp Hellsgore!
wider was dazugelernt
