Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CopyFile() kopiert letzte File nicht. (https://www.delphipraxis.net/159908-copyfile-kopiert-letzte-file-nicht.html)

br0wny 18. Apr 2011 12:05

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:
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;
Auch lösche ich vor dem Test zur Sicherheit immer nochmals alle Sicherungskopien..

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.

Sir Rufo 18. Apr 2011 12:32

AW: CopyFile() kopiert letzte File nicht.
 
Zunächst würde ich das wie folgt coden:
Delphi-Quellcode:
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;
Der Aufruf erfolgt dann so:
Delphi-Quellcode:
sicherungskopie( hauptfenster.Form1.ListBox1.Items );
Warum hast du
Delphi-Quellcode:
wcLoc
und
Delphi-Quellcode:
ss
unterschiedlich deklariert?
Delphi-Quellcode:
CopyFile
erwartet als Parameter beide Male
Delphi-Quellcode:
PWideChar
Somit sollte das hier funktionieren
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;

himitsu 18. Apr 2011 12:42

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 MSDN-Library durchsuchenCopyfile und MSDN-Library durchsuchenGetLastError

Delphi-Quellcode:
if not CopyFile(...) then
  ShowMessage(SysErrorMessage(GetLastError));

br0wny 18. Apr 2011 13:16

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:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird
Werde mir meinen weiteren Quelltext zu dem Anwendung durcharbeiten, um zu überprüfen ob ich nicht irgendwo die File schon benutze und die Verbindung nicht geschlossen habe.
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:
CopyFile( PWideChar( src ), PWideChar( tar ), false );
in
Delphi-Quellcode:
CopyFileW( PWideChar( src ), PWideChar( tar ), false );
ändern?

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?

scrat1979 18. Apr 2011 13:38

AW: CopyFile() kopiert letzte File nicht.
 
Zitat:

Zitat von br0wny (Beitrag 1095830)
Ich bekomme nämlich folgende Fehlermeldung (egal ob nur eine oder mehrere, aber immer bei der letzten File):
Zitat:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird

Könnte es sein, dass Du beim Füllen der Listbox-Items die Dateien öffnest und die letzte Datei nicht regulär geschlossen wird (= also quasi noch verwendet wird) - z.B. bedingt durch die Anordnung von AssignFile bzw. CloseFile in einer Schleife?

himitsu 18. Apr 2011 13:39

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:
for iZ := FileList.Count-1 downto 0 do begin
... mal sehn, ob es nun immer der erste Eintrag ist.
Wenn ja, dann liegt es schonmal nicht an dieser Schleife.

Dann gibt es Programme ala Bei Google suchenFile Unlocker, mit welchen man mal schauen kann, ob und wo diese Datei noch geöffnet ist.
> entweder ein externes Programm, oder du hast in deinem Programm/Code dieses Datei irgendwo vorher vergessen freizugeben.

br0wny 18. Apr 2011 14:14

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:
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;
Auch als ich die Schleife rückwärts durchgelaufen bin kam der Fehler.
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.

himitsu 18. Apr 2011 16:00

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:

Komischerweise hat aber Unlocker 1.9.1 nicht feststellen können,
Ja, es gibt mindestens eine Zugriffsart, welche fast alle derartigen Programme nicht entdeckten, aber der Großteil der "normalen" Zugriffe wird schon erkannt.


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