AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit CopyFile

Ein Thema von Berni68 · begonnen am 4. Sep 2016 · letzter Beitrag vom 6. Sep 2016
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Problem mit CopyFile

  Alt 4. Sep 2016, 12:39
das nunmehr ca. 3 Jahre einwandfrei funktioniert hat,
Delphi-Quellcode:
procedure TJobServerForm.VerschiebePdf;
        ok:= CopyFile(PChar(files[i]), PChar(ziel), false);
        if ok then DeleteFile(files[i]);
      except
        RaiseLastOSError;
      end;
Im Fehlerfall hat das noch niemals einwandfrei funktioniert, da diese APIs praktisch niemals eine Exception werfen, sondern nur einen Fehlercode liefern (Result=False + GetLastError).

Warum eigentlich nicht Bei Google suchenMoveFile?

Delphi-Quellcode:
if not EineWinAPI(...) then
  RaiseLastError;

Also ja, es kann sein, dass der VirenScanner eine neue Datei noch geöffnet hat, wenn du zugreifen willst.
Genauso kann z.B. auch ein Explorer-Plugin der Grund sein.
Im Explorer werden doch Dateiinformationen angezeigt ... dafür öffnet das Plugin die Dateien, um das auszulesen. (da macht Adobe gern mal Problemchen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Sep 2016 um 12:43 Uhr)
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Problem mit CopyFile

  Alt 4. Sep 2016, 13:08
Hallo himitsu,

da hast du recht.
Tatsächlich ist die ursprüngliche Variante auch:

if CopyFile(PChar(files[i]), PChar(ziel), false) then DeleteFile(files[i]);

Wenn es dann schief ging, warum auch immer, z.B. die Zieldatei ist geöffnet, wird die Datei nicht gelöscht.
Beim nächsten Durchlauf des Programmes ca. 5min später wird es dann wieder probiert usw.
Hat soweit eingentlich funktioniert.

Ich werde es auf jeden Fall auch mit MoveFile probieren.

Allerdings funktionierte auch der Versuch in der ich NUR kopiert habe NICHT.
Also ausschließich:

CopyFile(PChar(files[i]), PChar(ziel), false);

Ohne Delete.
Auch hier immer Absturz bei der 2. pdf
Da greife ich doch auf die neue Datei garnicht zu? Oder?
Bernhard
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Problem mit CopyFile

  Alt 4. Sep 2016, 17:33
Hallo,
ein Virenscanner kann schon dafür sorgen,
dass das Programm abschmiert.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 11:43
Da gibts dann noch ShFileOperation als Alternative.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Metschu

Registriert seit: 31. Dez 2006
151 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 11:45
Wenn der Virenscanner ein Programm Blockiert / Beendet, speichert er das dann nicht in der Historie oder so ab?

So müsste man es doch auch nachvollziehen können.
Torsten
Ich kam, sah und alles Funktionierte.
Dann klingelte mein Wecker...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 11:59
Delphi-Quellcode:
if CopyFile(..) <> 0 then
  RaiseLastOSError
Gibt das eine gescheite Fehlermeldung?

Aber so ganz glaub eich nicht, dass es an CopyFile liegt. Wenn sich ein Programm einfach so beendet, dann geht da sehr viel mehr schief als so ein banaler API Funktionsaufruf wie CopyFile.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#7

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 12:59
Die Schleife wird das erste mal korrekt durchlaufen (Datei wird korrekt kopiert und lokal gelöscht), beim zweiten mal immer Absturz,
und zwar genau bei der Anweisung nach ShowMessage('#');
except wird nicht durchlaufen.
Das weist ja eher darauf hin, daß du dir etwas beim ersten Durchlauf zerschießt.

Warum? Weil du behauptest, daß es beim ersten Mal funktioniert. Für die Serverseite oder das lokale Betriebssystem ist aber "das erste Mal" schon beim zweiten Test deines Programms nicht mehr das erste Mal! Ein AV-Filter könnte natürlich infrage kommen, da er bspw. auf Prozeßebene agieren könnte. Dann wäre aber das Durchlassen der ersten Datei eine Sicherheitslücke und ein solcher Scanner sollte gemieden werden.

Der Vollständigkeit halber: ich arbeite seit nunmehr zehn Jahren bei einem AV-Hersteller und bin selbst in der Entwicklung und Wartung des Dateisystemfiltertreibers tätig. Es handelt sich dabei nicht um Trend Micro.

Es sieht so aus als ob das nur bei .pdf-Dateien passiert, da an anderer Stelle mit ähnichem Code nicht pdf dateien problemlos verarbeitet werden.
Und mit gleichem Code? Parametrisiere doch einmal deine Funktion und übergib die Maske der zu kopierenden Dateiendungen. Es interessiert für das Debuggen nämlich nicht, ob es mit ähnlichem Code funktioniert, sondern nur ob es mit gleichem Code funktioniert. Abgesehen davon erlaubt dir die Parametrisierung aus zwei Funktionen mglw. eine zu machen.

Was kann man tun, ausser den Virenscanner für .pdf zu deaktivieren?
Anderen AV-Scanner einsetzen? Ernsthaft, es gibt kaum etwas was du im Usermode machen kannst, was den Scanner jucken würde. Üblicherweise wird schon das Öffnen der Datei abgefangen. Zugegeben, bei CopyFile siehst du davon nix, aber intern passiert da dennoch ein CreateFile usw.

In einigen Fällen wird auch das Schließen der Datei abgefangen. Kommt aber auf das exakte Szenario an.

Übrigens würde dir jeder normale AV-Scanner ein "Zugriff verweigert" liefern, was noch immer keinen Absturz nach sich zöge, es sei denn du reagiertest darauf nicht adäquat.

Hallo,
ein Virenscanner kann schon dafür sorgen,
dass das Programm abschmiert.
Das sind aber schon sehr grenzwertige Bedingungen, die dazu erfüllt sein müssen. Zumeist würde ich dann auch eine Zeitüberschreitung oder ähnliches erwarten (bspw. weil der Scan länger dauert). Da wäre dann auch interessant ob der lokale Scanner den Scan erledigt oder ob die Serverseite das macht. Da es nicht explizit angegeben ist, würde ich annehmen, daß es lokal gemacht wird - für jegliche Netzwerkpfade. Auch daß die Gegenseite etwas macht, womit CopyFile nicht klarkommt, ist unwahrscheinlich. Wenn die Gegenseite Windows oder Samba ist, würde ich es nahezu kategorisch ausschließen.

Mich würde noch interessieren was diese mysteriöse Funktion `ForceDirectories` macht.

Und dann noch was auf der Gegenseite läuft. Windows? Samba auf einem Linux?

Schonmal probiert das Programm mit procdump.exe zu starten und diesem aufzutragen bitte einen Minidump zu erstellen? Dann könnte man ja mindestens den Call-Stack sehen, auch wenn die Symbole von Delphi bekanntlich nicht kompatibel sind mit Microsoft's Debuggern.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#8

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 13:31
Mich würde noch interessieren was diese mysteriöse Funktion `ForceDirectories` macht.
Moin Olli, da kann ich weiterhelfen: http://docwiki.embarcadero.com/Libra...rceDirectories
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#9

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 13:46
Mich würde noch interessieren was diese mysteriöse Funktion `ForceDirectories` macht.
Moin Olli, da kann ich weiterhelfen: http://docwiki.embarcadero.com/Libra...rceDirectories
Dank dir! Dann hätte ich ein Problem mit der Verwendung der Funktion seitens des Fragestellers. Ich zitiere mal:

Zitat:
ForceDirectories gibt den Wert True zurück, wenn es alle notwendigen Verzeichnisse erstellt hat, und False, wenn das Verzeichnis nicht erstellt werden konnte.
Fehlt da nicht was im uns präsentierten Code? Stichwort: defensive Softwareentwicklung?!
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

AW: Problem mit CopyFile

  Alt 5. Sep 2016, 13:54
Strenggenommen müsste man den Rückgabewert von ForceDirectories abfragen und entsprechend reagieren.

Sollte im konkreten Fall beim Aufruf der Funktion ein Fehler auftreten, dann kracht es halt irgendwo im späteren Ablauf der Routine.

Wirklich sauber ist es so, wie es ist nicht, aber auch ein Scheitern von ForceDirectories und die daraus resultierenden Probleme dürften nicht dazu führen, dass sich ein Programm einfach sang- und klanglos verabschiedet.

Da muss irgendwo noch was anderes gewaltig schiefgehen, was aber so aus der Ferne nicht zu erkennen ist.
  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 07:56 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