AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi CopyFile() kopiert letzte File nicht.
Thema durchsuchen
Ansicht
Themen-Optionen

CopyFile() kopiert letzte File nicht.

Ein Thema von br0wny · begonnen am 18. Apr 2011 · letzter Beitrag vom 18. Apr 2011
Antwort Antwort
br0wny

Registriert seit: 8. Apr 2010
3 Beiträge
 
#1

CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 12:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 12:32
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:
sicherungskopie( hauptfenster.Form1.ListBox1.Items ); Warum hast du wcLoc und ss unterschiedlich deklariert?
CopyFile erwartet als Parameter beide Male 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.165 Beiträge
 
Delphi 12 Athens
 
#3

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 12:42
@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));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
br0wny

Registriert seit: 8. Apr 2010
3 Beiträge
 
#4

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 13:16
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
CopyFile( PWideChar( src ), PWideChar( tar ), false ); in
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?
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 13:38
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?
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.165 Beiträge
 
Delphi 12 Athens
 
#6

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 13:39
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
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
br0wny

Registriert seit: 8. Apr 2010
3 Beiträge
 
#7

problem solved

  Alt 18. Apr 2011, 14:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.165 Beiträge
 
Delphi 12 Athens
 
#8

AW: CopyFile() kopiert letzte File nicht.

  Alt 18. Apr 2011, 16:00
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz