CopyFile unzuverlässig?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
TT73GP7
Beiträge: 233
Registriert: Di 29. Mär 2016, 20:45

CopyFile unzuverlässig?

Beitrag von TT73GP7 »

Hallo zusammen,

ich sehe malwieder den Wald vor lauter Bäumen nicht.
Es geht um eine Anwendung die ich vor gefühlten 10000 Jahren Entwickelt habe. Mit dieser Anwendung kann man Dateien Archivieren (ganz einfache sache)

Nun funktioniert das auch alles
nur eben nicht immer

in 10 % aller Fälle wird die Datei nicht wegkoppiert.

Also User wählt die Datei x aus und sagt hinzufügen. Und schon macht die Software eine Kopie in seinen Ordner und verwart diese
Joar nur da kommt die Datei nie an :(

dummerweise weiß ich garnicht wo ich noch schauen soll und wie ich Die Software zuverlässiger bekomme
hat jemand eine Idee?



Code: Alles auswählen

 
procedure TfmMain.btnEinzelDateiHinzuClick(Sender: TObject);
var
  FilenamePfad : String;
  Filename     : String;
  FilenameNeu  : String;
  FileExT      : String;
begin
 
 
    if (dsDateienBaum.DataSet.FieldByName('ID').AsString <> '') then begin
      if (OpenDialogFile.Execute) then begin
        FilenamePfad := OpenDialogFile.FileName;
        Filename     := ExtractFileName(FilenamePfad);
        FileExT      := ExtractFileExt(FilenamePfad);
        if (LnSQL('ID','SELECT MAX(ID)+1 as ID FROM DBDateien') = '') then begin
          FilenameNeu  := '0';
        end else begin
          FileNameNeu := LnSQL('ID','SELECT MAX(ID)+1 as ID FROM DBDateien');
        end;
        FilenameNeu := FilenameNeu + FileExT;
        CopyFile(PAnsiChar(FilenamePfad), PAnsiChar('C:\Lazarus-Projekte\myIdent\Dateien\'+FilenameNeu), False);
        SQL('
Insert Into DBDateien (FilenName, Pfad,FK_DateiBaum) VALUES ("'+FileName+'", "C:\Lazarus-Projekte\myIdent\Dateien\'+FilenameNeu+'","'+dsDateienBaum.DataSet.FieldByName('ID').AsString+'")');
      end;
    end;
    dsDateien.DataSet.Refresh;
end;       

sstvmaster
Beiträge: 345
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: CopyFile unzuverlässig?

Beitrag von sstvmaster »

Du prüfst ja dein CopyFile nicht.

CopyFile gibt true zurück oder macht ein exception. -> https://lazarus-ccr.sourceforge.io/docs ... yfile.html
LG Maik

TT73GP7
Beiträge: 233
Registriert: Di 29. Mär 2016, 20:45

Re: CopyFile unzuverlässig?

Beitrag von TT73GP7 »

ja perfekt!

somit kann ich zumindest den Fehler abfangen und nee Meldung ausgeben

Code: Alles auswählen

 
        if  (CopyFile(PAnsiChar(FilenamePfad), PAnsiChar('C:\Lazarus-Projekte\myIdent\Dateien\'+FilenameNeu), False) = True) then begin
          SQL('
Insert Into DBDateien (FilenName, Pfad,FK_DateiBaum) VALUES ("'+FileName+'", "C:\Lazarus-Projekte\myIdent\Dateien\'+FilenameNeu+'","'+dsDateienBaum.DataSet.FieldByName('ID').AsString+'")');
        end else begin
          ShowMessage('
Fehler beim Kopieren');
        end;


Aber warum geht das dann und wann nicht?
das würde mich viel mehr Interressieren

für mich echt ein Rätzel

pluto
Lazarusforum e. V.
Beiträge: 7114
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: CopyFile unzuverlässig?

Beitrag von pluto »

(CopyFile(PAnsiChar(FilenamePfad), PAnsiChar('C:\Lazarus-Projekte\myIdent\Dateien'+FilenameNeu)

Müsste zwischen Dateien'+FilenameNeu) nicht ein \ hin? oder eine Prüfung ob bereits ein \ Vorhanden ist?

Außerdem sollten Feste Pfade, wenn Möglich vermieden werden.

Du kannst auch noch ein FileExists ode so ähnlich einbauen, dann weiß du, ob es das Quellverzeichnis gibt und mit DirectoryExists oder so ähnlich kannst du Prüfen ob es das Verzeichnis überhaupt gibt.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4222
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: CopyFile unzuverlässig?

Beitrag von af0815 »

TT73GP7 hat geschrieben:Aber warum geht das dann und wann nicht?
das würde mich viel mehr Interressieren

Ich sehe hier WIndows - Abgesehen davon, das die Rechte am Verzeichnis, der Datei nicht passen können. Die diversen Scans der AV Lösungen verzögern bzw. blockieren schon mal. Bsp: wenn ich im VPN bin und eine exe starte kann es sein, das ich 30-50 Sekunden warten muss bevor die Datei gestartet wird. Bin draufgekommen, weil ich mal ne Meldung vom AV bekommen habe, das die Internetverbindung fehlt und er die SIgnatur nicht prüfen kann - war nen MS-Tool das das ungefragt macht.

Aktuell habe ich das Gefühl das MS und der AV Hersteller am System herumbasteln. Updates überall und plötzlich ungewollte Prüftools auf der Platte gehabt (vom AV Hersteller). War sogar eine angepasste Version von pcap dabei damit sie das Netzwerk auf Fremdgeräte überwachen können.

Das sind halt Faktoren die mittlerweile ein einfache Dateioperation beeinflussen können.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

BeniBela
Beiträge: 269
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: CopyFile unzuverlässig?

Beitrag von BeniBela »

Die Funktion ist sowieso ganz komisch, weil sie die Quelldatei dreimal öffnen will, wenn es beim ersten Mal nicht klappt. Wenn sie beim ersten Mal nicht geht, wieso soll es dann beim dritten Mal gehen?

Auf Android habe ich jetzt auch Probleme, dass Dateien nicht geschrieben werden können

sstvmaster
Beiträge: 345
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: CopyFile unzuverlässig?

Beitrag von sstvmaster »

So in etwa könnte man auch noch prüfen.

Windows only!

Code: Alles auswählen

 
 
uses
  Windows, FileUtil, ... 
 
 
procedure TForm1.Button1Click(Sender: TObject);
 
procedure ShowErrorMsg(aLastError: integer);
begin
  ShowMessage(SysErrorMessage(aLastError) + #13#10 + 'LastError: (' + IntToStr(aLastError)+ ')');
end;
 
var
  hFile: THandle;
  SrcFile, DstFile: string;
begin
  DstFile := ExtractFilePath(Paramstr(0)) + 'DstFile.txt';
  SrcFile := ExtractFilePath(Paramstr(0)) + 'SrcFile.txt';
 
  // hier werden auch die Rechte mit geprüft
  hFile := FileCreate(DstFile);
 
  // LastError auswerten
  case GetLastError of
 
    // Alles OK
    0: begin
         // Wichtig! Handle muss wieder freigegeben werden
         FileClose(hFile);
 
         // Datei kopieren und prüfen
         if CopyFile(SrcFile, DstFile, false) then
           ShowErrorMsg(GetLastError);
         // else ...
    end;
 
    // Zugriff verweigert
    5: begin ShowErrorMsg(GetLastError); end;
 
    // Datei vorhanden
    183: begin
           FileClose(hFile);
           ShowErrorMsg(GetLastError);
 
    end;
 
    // Sonstige Fehler
    else begin
           FileClose(hFile);
           ShowErrorMsg(GetLastError);
    end;
 
  end;
 
end;
 
...
 
Zuletzt geändert von sstvmaster am Sa 23. Mär 2019, 16:41, insgesamt 3-mal geändert.
LG Maik

Ally
Beiträge: 155
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Re: CopyFile unzuverlässig?

Beitrag von Ally »

Zwischenfrage:

Ist PChar in den folgenden Zeilen nicht überflüssig?

Code: Alles auswählen

hFile := FileCreate(PChar(DstFile));
if CopyFile(PChar(SrcFile), PChar(DstFile), false) then
 

sstvmaster
Beiträge: 345
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: CopyFile unzuverlässig?

Beitrag von sstvmaster »

@Ally

kommt drauf an welche Unit man in den uses drin hat.

Nur Windows, dann mit PChar.
Mit FileUtil auch ohne.
LG Maik

Ally
Beiträge: 155
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Re: CopyFile unzuverlässig?

Beitrag von Ally »

Hallo sstvmaster,

ich war gerade mitten im Antworten, da habe ich gesehen das du deine Antwort "etwas" abgeänert hast.
Jetzt verstehe ich warum PChar benutzt wurde. Ich benutze FileUtil und {$mode objfpc}{$H+} und kann somit UTF8-Strings ohne Probleme benutzen.

Gruß Roland

sstvmaster
Beiträge: 345
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.8 + Fixes + Trunk 32bit
CPU-Target: 32Bit
Wohnort: Dresden

Re: CopyFile unzuverlässig?

Beitrag von sstvmaster »

Ja sorry.

Ich wusste leider nicht das es CopyFile in verschiedenen Units gibt. Ich hätte ja die Funktion aus der Windows unit entfernt,
aber sie ist wahrscheinlich aus Kompatibilitätsgründen drin sein.
LG Maik

Antworten