Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TFileCopy error (https://www.delphipraxis.net/214102-tfilecopy-error.html)

HCB 16. Nov 2023 08:07

Delphi-Version: 11 Alexandria

TFileCopy error
 
Hallo,
ein Problem treibt mich hierher, in der Hoffnung Ideen oder Lösungen zu finden.
Ich erstelle ein Verzeichnis, ok. Dann werden Dateien hinein kopiert, ok.
Ein zweiter Rechner (oder eine zweite Instanz vom Programm) startet die App.
Das Verzeichnis mit den vorhandenen Files wird gelöscht, dann neu erstellt, ok.
Jetzt sollen neue Dateien hinein kopiert werden - Jetzt wir ein Fehler ausgeworfen -
und es wird nichts kopiert.

Hier der Code:
try
IsRecursive := true;
if TDirectory.Exists(ExportPfad) then TDirectory.Delete(ExportPfad, IsRecursive);
except
ErrorMsg('Fehler beim Löschen im Verzeichnispfad!',ArchivPfad+#13+ExportPfad,Modul) ;
end;

TDirectory.CreateDirectory((ExportPfad));
if ConfirmMsg('Sollen jetzt die '+IntToStr(DataMod.Q_ReExport.RecordCount)+' Dateien exportiert werden?','') = mrYes
then
begin
DataMod.Q_ReExport.First;
for I:= 1 to DataMod.Q_ReExport.RecordCount do
begin
try
TFile.Copy(ArchivPfad+IntToStr(DataMod.Q_ReExporti d.Value)+'.pdf',ExportPfad+DataMod.Q_ReExportReNum mer.Value+'.pdf');
except
ErrorMsg('Fehler beim Kopieren, Dateiname nicht existent oder Pfad falsch! '+#13+ArchivPfad+IntToStr(DataMod.Q_ReExportid.Val ue)+'.pdf'+#13
+ExportPfad+DataMod.Q_ReExportReNummer.Value+'.pdf '+#13+'Bitte wiederholen.','',Modul);
EXIT;
end;
DataMod.Q_ReExport.next;
end;
end;
end;
end;

Hat jemand eine Idee woran das liegen könnte?

LG Harry

DeddyH 16. Nov 2023 08:47

AW: TFileCopy error
 
Welcher Fehler wird denn geworfen? Übrigens: schließe Delphi-Code doch bitte in die entsprechenden Tags ein [ delphi]Code[ /delphi] (ohne die Leerzeichen), dann ist er viel besser zu lesen.

Jasocul 16. Nov 2023 08:53

AW: TFileCopy error
 
Aus der Online-Hilfe:
Zitat:

Note: Copy raises an exception if the source file does not exist, the paths are invalid, or the user does not have enough privileges to perform the copy operation.
Hast du das bereits genau geprüft?
Du lieferst leider etwas wenig Infos, daher ist es schwierig eine gute Hilfestellung zu geben. Ich könnte mir aber vorstellen, dass du ForceDirectories statt CreateDirectory nehmen musst, da du das Verzeichnis ja auch rekursiv löscht.

DeddyH 16. Nov 2023 09:19

AW: TFileCopy error
 
Es würde ja vielleicht schon weiterhelfen, wenn man die Original-Fehlermeldung der Exception ausgibt:
Delphi-Quellcode:
try
  MachWas;
except
  on E: Exception do
    ShowMessage('Uups, ein Fehler: ' + E.Message);
end;

HCB 16. Nov 2023 09:39

AW: TFileCopy error
 
So wie es aussieht, kann nicht kopiert werden da das Verzeichnis nicht mehr besteht, ob wohl vor der Kopieraktion das neu erstellt werden soll.
Zuerst wird mit
Delphi-Quellcode:
 if TDirectory.Exists(ExportPfad) then TDirectory.Delete(ExportPfad, IsRecursive);
das Verzeichnis mit allen Dateien gelöscht,
danach wird mit
Delphi-Quellcode:
 TDirectory.CreateDirectory((ExportPfad));
das Verzeichnis wieder erstellt.

Aber aus irgendwelchen Gründen wird bei der zweiten Instanz der App dieses Verzeichnis ohne Fehlermeldung NICHT erstellt, somit kann die nachfolgende Kopieraktion nicht ausgeführt werden.
Auch mit
Delphi-Quellcode:
 if forcedirectories(ExportPfad) then ....
geht es nicht.

LG Harry

Jasocul 16. Nov 2023 09:52

AW: TFileCopy error
 
Das klingt jetzt vielleicht ein wenig blöd, aber bist du mit dem Debugger Schritt für Schritt durchgegangen, hast parallel den Datei-Explorer offen für eine Kontrolle (bei jedem Schritt) und dir jede Variable bei jedem Schritt genau angesehen?
Gegebenenfalls solltest du in einem weiteren Explorer den Inhalt der Variablen dort einsetzen.

HCB 16. Nov 2023 10:27

AW: TFileCopy error
 
Mit dem Explorer habe ich überprüft, das Verzeichnis wird gelöscht.
Mit den Variablen probier ich mal aus.
Danke.

noisy_master 16. Nov 2023 10:56

AW: TFileCopy error
 
Moinsen,

für mich klingt das nach einer Race-Condition: Die erste Instanz kopiert noch, während die die zweite Instanz schon versucht das Verzeichnis zu löschen....Hast du mal versucht die zweite Instanz WESENTLICH später zu starten(wenn die erste fertig kopiert hat)?

HCB 16. Nov 2023 14:30

AW: TFileCopy error
 
@noisy_master: Vielen Dank! Ja, ich denke das könnte es gewesen sein. Wenn man eine Weile wartet, scheint das Problem nicht mehr aufzutreten.
Allerdings kam der Fehler nach 8 maligem Probieren wieder. Aber so oft wird die Funktion ja nicht hintereinander aufgerufen.
Trotzdem bin ich nicht ganz zufrieden. Aber ersteinmal muss das so laufen.

An alle anderen hier, Danke!

LG Harry

Benmik 16. Nov 2023 17:08

AW: TFileCopy error
 
Was ich daran nicht verstehe: Diese ganze Datei- oder Verzeichnisoperationen sind doch Funktionen, die den Erfolg zurückmelden. Wenn die Funktion zurückkehrt, dann muss die Operation doch ausgeführt sein? Das Ganze wird doch nicht multithreaded durchgeführt?

himitsu 16. Nov 2023 18:00

AW: TFileCopy error
 
Virenscanner und Dergleichen können sich nachfolgen nochmal kurz daran zu schaffen machen. (und die Datei dabei eventuell vorübergehend sperren)

Benmik 16. Nov 2023 21:15

AW: TFileCopy error
 
Naja, er schreibt ja
Zitat:

Aber aus irgendwelchen Gründen wird bei der zweiten Instanz der App dieses Verzeichnis ohne Fehlermeldung NICHT erstellt,
Welcher Virenscanner blockiert denn die Erstellung eines Verzeichnisses?

Ich fände die Auflösung des Rätsels interessant, vielleicht schraubt HCB doch ein kleines Beispielprogramm zusammen? Die Erwähnung "oder von einem anderen Rechner" lässt mich allerdings vermuten, dass es hier um ein Netzlaufwerk geht.

HCB 17. Nov 2023 10:18

AW: TFileCopy error
 
Hallo nochmal,

das Programm wird lokal auf 3 Rechnern ausgeführt und greift im LAN auf ein Verzeichnis eines NAS Laufwerks zu.
Dieses Verzeichnis wird gelöscht und danach mit Dateien gefüllt wenn einer der Rechner die "Exportfunktion" ausführt. Soweit so gut.
Es kommt aber öfter vor, dass wenn der Export von PC1 ausgeführt wurde, hinterher z.B. von PC2 die "Exportfunktion" einen Zugriffsfehler auswirft.
In diesem Fall wurde das Verzeichnis nicht erstellt.
Vielleicht liegt es auch am NAS Betreibssystem, wer weiß?

LG Harry

Sinspin 17. Nov 2023 10:26

AW: TFileCopy error
 
Warum exportieren denn alle PC immer in das gleiche Verzeichnis? Sind doch verschiedene PC.
Und warum erstellst du nicht für jeden Export ein neues Verzeichnis? Und behält die alten Exporte für den Fall das bei den neuen was schief geht?
Um ein zumüllen des NAS zu verhindern kann jeder PC seine alten Backups ja nach einiger Zeit löschen.

Raible 17. Nov 2023 11:59

AW: TFileCopy error
 
Ich würde das Verzeichnis nicht löschen nur die Dateien im Verzeichnis.
Außerdem solltest Du ein Lock Mechanismus implementieren, so das eine Instanz die Aufgabe immer vollständig abarbeiten kann ohne das eine Andere dazwischenfunkt.

himitsu 17. Nov 2023 12:55

AW: TFileCopy error
 
Kommt ein Open-/SaveDialog zum Einsatz?

Das Mistding ändert standardmäßig das Arbeitsverzeichnis auf den gewählten Pfad.
Dadurch wird natürlich dieses Verzeichnis gesperrt und ließe sich nicht löschen.

Aber egal ... sowas Ähnliches kann auch durch andere Dinge passieren.


Im meinem NAS hatte ich mal im SMB versucht Verwaltungs-Dateien des NAS auf Ignorieren zu setzen.
Sie waren dann im SMB nicht mehr sichtbar, aber wenn versucht wurde so ein Verzeichnis zu löschen, dann hieß es natürlich, dass dieser Pfad nicht leer sei und Löschen ging nicht (von extern).
Im FileBrowser des NAS waren/sind diese Dateien/Verzeichnisse auch nicht sichtbar, aber der hat beim Löschen keine Probleme damit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:23 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