![]() |
CopyFile() kopiert letzte File nicht.
Hallo liebes Delphi-Praxis Forum,
ich möchte in meiner kleinen Anwendung dBase-Files sichern. Zu aller erst wähle ich ein paar Files aus und speichere in eine Listbox die Pfade. Meine kleine Schleife hier soll die ausgewählten Dateien (welche sich alle in ein und demselben Ordner 'D:\abcjob\' befinden) in selbigen Ordner sichern. Nur leider kopiert CopyFile() mir leider alle Files außer die letzte in der Listbox. Wenn ich nur eine File ausgesucht habe, wird diese erst gar nicht kopiert. Folgenden Code habe ich erstellt:
Delphi-Quellcode:
Auch lösche ich vor dem Test zur Sicherheit immer nochmals alle Sicherungskopien..
procedure sicherungskopie();
var iZ : Integer; wcLok : PWideChar; ss : array[0..256] of char; begin for iZ := 0 to hauptfenster.Form1.ListBox1.Items.Count-1 do begin wcLok := pwidechar('D:\abcjob\' + 'SICHERUNGSKOPIE_' + IntToStr(iZ) + '.dbf'); StrPCopy(ss, hauptfenster.Form1.ListBox1.Items[iZ]); CopyFile(ss, wcLok, false); end; end; Arbeite noch leider nicht so lang mit Delphi und sehe bei so "wenig" Code leider den Fehler nicht. Ich hoffe Ihr könnt mir helfen. Mit freundlichen Grüßen aus Nürnberg br0wny. |
AW: CopyFile() kopiert letzte File nicht.
Zunächst würde ich das wie folgt coden:
Delphi-Quellcode:
Der Aufruf erfolgt dann so:
procedure sicherungskopie( const FileList : TStrings );
var iZ : Integer; wcLok : PWideChar; ss : array[0..256] of char; begin for iZ := 0 to FileList.Count-1 do begin wcLok := pwidechar( 'D:\abcjob\' + 'SICHERUNGSKOPIE_' + IntToStr( iZ ) + '.dbf' ); StrPCopy( ss, hauptfenster.Form1.ListBox1.Items[ iZ ] ); CopyFile( ss, wcLok, false ); end; end;
Delphi-Quellcode:
Warum hast du
sicherungskopie( hauptfenster.Form1.ListBox1.Items );
Delphi-Quellcode:
und
wcLoc
Delphi-Quellcode:
unterschiedlich deklariert?
ss
Delphi-Quellcode:
erwartet als Parameter beide Male
CopyFile
Delphi-Quellcode:
Somit sollte das hier funktionieren
PWideChar
Delphi-Quellcode:
procedure sicherungskopie( const FileList : TStrings );
var iZ : Integer; src, tar : string; begin for iZ := 0 to FileList.Count-1 do begin tar := 'D:\abcjob\' + 'SICHERUNGSKOPIE_' + IntToStr( iZ ) + '.dbf'; src := FileList[ iZ ]; CopyFile( PWideChar( src ), PWideChar( tar ), false ); end; end; |
AW: CopyFile() kopiert letzte File nicht.
@Sir und br0wny:
Ihr sollt doch keine dymamischen mit statischen Versionen mischen :!: dynamisch (ab D2009 Unicode, sonst Ansi): CopyFile + PChar + String statisch: CopyFileW + PWideChar + WideString/UnicodeString CopyFileA + PAnsiChar + Ansistring @br0wny: CopyFile hat Rückgabewerte (das Result und den WindowsFehlercode), welche man mal prüfen sollte/könnte. > siehe ![]() ![]()
Delphi-Quellcode:
if not CopyFile(...) then
ShowMessage(SysErrorMessage(GetLastError)); |
AW: CopyFile() kopiert letzte File nicht.
Hallo Sir Rufo und himitsu.
Sir Rufo: Vielen Dank für deine schnelle Hilfe und Reaktion ! Ich habe mir den Quellcode aus anderen Beitrag in einem anderen Forum abgekupfert. In diesem war es genau so deklariert und ich habe es einfach übernommen. Das src und tar erst in CopyFile() in PWideChar's umgewandelt werden finde ich ganz pfiffig gelöst. Danke für den Hinweis das es so auch möglich ist ;) Habe auch deinen Code so eingefügt, aber leider funktioniert es immer noch nicht. himitsu: Auch dir vielen Dank für deine Hilfe. Das mit dem Fehlercode bei CopyFile() ist ein guter Tipp, danke! Ich bekomme nämlich folgende Fehlermeldung (egal ob nur eine oder mehrere, aber immer bei der letzten File): Zitat:
Oder würde euch etwas spontan einfallen woran das liegen könnte? Jetzt muss ich ehrlich gesagt ganz doof nachfragen was du mit 'mischen von statischen und dynamischen Versionen' meinst. Soll ich dann meine Zeile mit
Delphi-Quellcode:
in
CopyFile( PWideChar( src ), PWideChar( tar ), false );
Delphi-Quellcode:
ändern?
CopyFileW( PWideChar( src ), PWideChar( tar ), false );
Mit freundlichen Grüßen br0wny PS: Bin ich zu doof dafür den Buchstaben 'W' in CopyFileW in dem Delphitag fett oder unterstrichen zu formatieren oder ist das gar nicht möglich? |
AW: CopyFile() kopiert letzte File nicht.
Zitat:
|
AW: CopyFile() kopiert letzte File nicht.
Da dein Parameter TStrings und die einzelnen werte somit String sind, wäre die dynamischen PChar und CopyFile passend (lso ohne Wide).
Du könntest mal die Schleife rückwärts laufen lassen
Delphi-Quellcode:
... mal sehn, ob es nun immer der erste Eintrag ist.
for iZ := FileList.Count-1 downto 0 do begin
Wenn ja, dann liegt es schonmal nicht an dieser Schleife. Dann gibt es Programme ala ![]() > entweder ein externes Programm, oder du hast in deinem Programm/Code dieses Datei irgendwo vorher vergessen freizugeben. |
problem solved
Soo.. habe ich den Übeltäter jetzt gefunden.
In einer anderen Prozedur die vorher durchlaufen wird, stelle ich eine Verbindung mit dem TTable Objekt her, um einige Informationen auszulesen und die Dateien später zu einer einzigen File zu verbinden. Dort habe ich vergessen die Verbindung wieder zu schließen um weiter zu arbeiten. Jetzt habe ich diese wieder geschlossen und zack funktioniert es! --------------------------------------- Hallo scrat1979: Meine Listbox fülle ich hiermit, aber da hatte ich keinen Fehler gefunden:
Delphi-Quellcode:
Auch als ich die Schleife rückwärts durchgelaufen bin kam der Fehler.
procedure btnhinz();
begin if hauptfenster.Form1.OpenDialog1.Execute then begin hauptfenster.Form1.Label1.Caption := hauptfenster.Form1.OpenDialog1.FileName; //Diese Label ist nur für Testzwecke, kann gelöscht werden hauptfenster.Form1.ListBox1.Items.Add(hauptfenster.Form1.OpenDialog1.FileName); end else begin ShowMessage('Oeffnen fehlgeschlagen!'); end; end; Komischerweise hat aber Unlocker 1.9.1 nicht feststellen können, das eine Verbindung zwischen meinem Delphi XE und der File besteht. Ich bin einfach von Anfang bis zu dem Punkt, an dem meine sicherungskopie() Prozedur ins Spiel kommt verfolgt und so den Fehler gefunden. Vielen lieben Dank an alle die geholfen haben, wäre selbst sonst ewig umher geirrt um auf die Fehlermeldung und somit auf die Lösung zu kommen! Der Thread kann schätz ich mal geclosed werden ;) Mit freundlichen Grüßen br0wny. |
AW: CopyFile() kopiert letzte File nicht.
Geschlossen werden hier nur "böse" Threads ... könnte ja sein, daß irgendwann nochmal jemand soein Problem hat.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz