Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FindFirst/FindNext auf Samba-Server findet nicht alle (https://www.delphipraxis.net/188906-findfirst-findnext-auf-samba-server-findet-nicht-alle.html)

handson 19. Apr 2016 08:37

Delphi-Version: 2007

FindFirst/FindNext auf Samba-Server findet nicht alle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Ich habe ab und zu mal ein merkwürdiges Problem. Auf einem Samba-Server habe ich einen Ordner liegen, der teilweise 200-1000 Dateien beinhaltet. Diese werden von meinem Programm per FindFirst/FindNext gesucht und eingetragen. Zu 95% klappt das auch, aber hin und wieder findet er nur 2-3 Dateien, ohne Fehler. Startet man die Funktion erneut im gleichen Atemzug, findet er den Rest.
Heute z.B. lagen 737 Dateien dort. Erster Start der Funktion hat er 2 Dateien gefunden, direkt danach die restlichen 735.

Wie die Dateien aussehen, seht ihr im Anhang.

Hier mal mein Code-Schnipsel:

Delphi-Quellcode:
:
:

    Begin
      FileName := Konst.ImportPfadKonstanten.XMLImport + 'INV*.*';
      If FindFirst(FileName,faAnyFile,SR) = 0 Then
      Begin
        Repeat
          InvoiceDateien.Add(SR.Name);
        Until FindNext(SR) <> 0;
        FindClose(SR);
        Result := True;
      End Else
      Begin
        MessageDlg('Es konnten keine Import-Dateien im Pfad '+Konst.ImportPfadKonstanten.XMLImport+' gefunden werden!',
                   mtWarning,[mbOK],0);
        Result := False;
      End;
    End;

:
:
Hat jemand auch schon mal so ein Phänomän gehabt? Irgendwie skurril...

Stephan

Dalai 19. Apr 2016 12:38

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Hast du deine Funktion mal die absoluten Pfade protokollieren lassen und z.B. mit der Ausgabe von
Code:
dir /s /b <verzeichnis>
verglichen?

MfG Dalai

himitsu 19. Apr 2016 13:47

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Ein Cache-Problem?
Dein Programm liest schneller, als die Dateiliste vom Server kommt. Ist also schon vorher am Ende der gespeicherten Liste und denkt es geht nicht weiter.

Mal das Result korrekt vollständig auswerten, falls es andere Gründe gibt?
Delphi-Quellcode:
ErrorCode := FindFirst(FileName, faAnyFile, SR);
if ErrorCode = S_OK Then begin
  try
    repeat
      InvoiceDateien.Add(SR.Name);
      ErrorCode := FindNext(SR);
      if ErrorCode <> ERROR_NO_MORE_FILES then
        RaiseLastOSError(ErrorCode);
    until ErrorCode = S_OK;
  finally
    FindClose(SR);
  end;
end else if ErrorCode <> ERROR_FILE_NOT_FOUND then
  RaiseLastOSError(ErrorCode);

handson 21. Apr 2016 09:47

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Ja, das kling plausibel... Das mit dem Extra-Fehler auslesen könnte ich machen.

Mal angenommen, es würde tatsächlich der Cache sein, dann wäre die Frage, wie könnte ich das am besten ausbremsen. Vielleicht mit einem Delay in der Schleife..??

Bernhard Geyer 21. Apr 2016 09:50

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Samba? Aktuellest Version mit allen Fixes.
Wir haben auch schon die erfahrungen (mit NAS per SAMBA) das (ältere Versionen?) sich nicht 100% wie ein Windows-Server verhält, also noch merkbare Fehler hat.

handson 21. Apr 2016 10:10

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Ok, das probiere ich auch mal aus, ob ich das was Neues bekomme...

himitsu 21. Apr 2016 12:19

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Im Ideal gäbe es einen "Befehl", mit dem man dem SMB-Treiber sagen kann, er solle der/die/das Cache aktualisieren, welchen man vor dem Auflisten ausführt.

Oder mal so probieren. (auch wenn es nicht die zuverlässigste/beste Lösung ist)
Delphi-Quellcode:
First := True;
repeat
  if First then begin
    Count := -1;
    First := False;
  end else
    Count := FileList.Count;
  FileList.Clear;
  ErrorCode := FindFirst(FileName, faAnyFile, SR);
  if ErrorCode = S_OK Then begin
    try
      repeat
        FileList.Add(SR.Name);
        ErrorCode := FindNext(SR);
        if ErrorCode <> ERROR_NO_MORE_FILES then
          RaiseLastOSError(ErrorCode);
      until ErrorCode = S_OK;
    finally
      FindClose(SR);
    end;
  end else if (ErrorCode <> ERROR_FILE_NOT_FOUND) and (ErrorCode <> ERROR_PATH_NOT_FOUND) then
    RaiseLastOSError(ErrorCode);
  Sleep(500);
until FileList.Count = Count;
Vielleicht noch mit einem Limit an Loops, falls man auf ein sich ständig veränderndes Verzeichnis trifft.

handson 22. Apr 2016 07:55

AW: FindFirst/FindNext auf Samba-Server findet nicht alle
 
Vielen Dank. Ich werde das mal ausprobieren. Nach einer Woche kann ich ein Resultat senden. ;-)

... achso, das Update auf eine aktuellere Version des Samba-Servers hat leider nicht das gewünschte Ergebnis erzielt.

Stephan


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