CopyFile unzuverlässig?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

CopyFile unzuverlässig?

Beitragvon TT73GP7 » 21. Mär 2019, 14:22 CopyFile unzuverlässig?

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;       
TT73GP7
 
Beiträge: 233
Registriert: 29. Mär 2016, 19:45

Beitragvon sstvmaster » 21. Mär 2019, 14:37 Re: CopyFile unzuverlässig?

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
sstvmaster
 
Beiträge: 240
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon TT73GP7 » 21. Mär 2019, 14:49 Re: CopyFile unzuverlässig?

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
TT73GP7
 
Beiträge: 233
Registriert: 29. Mär 2016, 19:45

Beitragvon pluto » 21. Mär 2019, 17:54 Re: CopyFile unzuverlässig?

(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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 7028
Registriert: 19. Nov 2006, 12:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

Beitragvon af0815 » 21. Mär 2019, 18:44 Re: CopyFile unzuverlässig?

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).
af0815
 
Beiträge: 3863
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon BeniBela » 22. Mär 2019, 00:02 Re: CopyFile unzuverlässig?

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
BeniBela
 
Beiträge: 263
Registriert: 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4) | 
CPU-Target: 64 Bit
Nach oben

Beitragvon sstvmaster » 22. Mär 2019, 19:21 Re: CopyFile unzuverlässig?

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 23. Mär 2019, 16:41, insgesamt 3-mal geändert.
LG Maik
sstvmaster
 
Beiträge: 240
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon Ally » 23. Mär 2019, 09:28 Re: CopyFile unzuverlässig?

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
 
Ally
 
Beiträge: 142
Registriert: 11. Jun 2009, 08:25

Beitragvon sstvmaster » 23. Mär 2019, 15:45 Re: CopyFile unzuverlässig?

@Ally

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

Nur Windows, dann mit PChar.
Mit FileUtil auch ohne.
LG Maik
sstvmaster
 
Beiträge: 240
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon Ally » 23. Mär 2019, 16:09 Re: CopyFile unzuverlässig?

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
Ally
 
Beiträge: 142
Registriert: 11. Jun 2009, 08:25

Beitragvon sstvmaster » 23. Mär 2019, 16:35 Re: CopyFile unzuverlässig?

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
sstvmaster
 
Beiträge: 240
Registriert: 22. Okt 2016, 22:12
Wohnort: Dresden
OS, Lazarus, FPC: OS: Windows 10 | Lazarus: 2.0.6 + Trunk 32bit | 
CPU-Target: 32Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: MSN [Bot] und 7 Gäste

porpoises-institution
accuracy-worried