Verrücktes Verhalten von DIRECTORY()

Sonstiges (nicht kategorisierbar)

Moderator: Moderatoren

Antworten
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Liebe Xbase-Gemeinde,

ich beobachte gerade in einem Einzelfall ein völlig verrücktes Verhalten des Befehls DIRECTORY():

Ich habe ein Verzeichnis (nennen wir es TEST), in dem viele Dateien stehen, deren Namen alle 11-stellige Nummern sind. Zum Beispiel diese:
86020200630.JPG
86120200630.JPG
86220200630.JPG
86320200630.JPG
86420200630.JPG
86520200630.JPG
86720200630.JPG
86720200819.JPG
86720201023.JPG
86720210114.JPG
86720210702.JPG
86820200630.JPG
86920200630.JPG
(Alle anderen Dateien im Verzeichnis beginnen nicht mit 86)

Wenn ich jetzt
dirarray := DIRECTORY("TEST\862*.JPG")
ausführe, erhalte ich erstaunlicherweise ein Array mit ZWEI Elementen, nämlich
dirarray[1][F_NAME] = "86220200630.JPG" (richtig!) und
dirarray[2][F_NAME] = "86720210702.JPG" (falsch!!).

Wieso zum Teufel wird diese zweite Datei aufgesammelt, die an dritter Stelle eine falsche Ziffer (7 statt 2) hat?

Und jetzt wird's ganz seltsam:
  • Wenn ich die Datei 86720210702.JPG umbenenne in 86720210701.JPG oder 86720210703.JPG (also die LETZTE Stelle ändere), tritt der Fehler nicht mehr auf (das Array enthält also beim erneuten Test nur noch ein Element).
  • Wenn ich danach die Datei wieder in 86720210702.JPG zurückbenenne, tritt der Fehler wieder auf.
Was sagt man dazu?

Der Fehler tritt auch dann noch auf, wenn ich
  • den Verzeichnisnamen ändere
  • das Verzeichnis oder die Dateien darin woandershin kopiere
  • alle Dateien außer den beiden betroffenen aus dem Verzeichnis entferne
  • das Verzeichnis statt auf dem Server lokal auf C: kopiere und dort aufrufe
  • den Dateien 86220200630.JPG und 86720210702.JPG andere Namen gebe, zwei neue Dateien im Verzeichnis generiere und diese in 86220200630.JPG und 86720210702.JPG umbenenne (selbst wenn das eigentlich keine JPGs, sondern leere Textdateien sind)
Der Fehler tritt aber NICHT auf, wenn ich
  • 86720210702.JPG in 86720210207.JPG umbenenne (also hinten 2 und 7 vertausche).
  • ein neues Verzeichnis mit zwei neuen Dateien erstelle, die ebenfalls 86220200630.JPG und 86720210702.JPG heißen.
Weitere Fakten zum Fehler:
  • Ich habe es bisher nicht geschafft, diesen Fehler mit einer anderen Nummer als 862* zu bekommen. (Ich habe das mit einer Schleife getestet und alle dreistelligen Nummern durchprobiert.)
  • Wenn ich mir den Inhalt des Verzeichnisses mit einem Editor (der nichts mit Xbase zu tun hat) angucke und dort auf 862* einschränke, wird mir nur die richtige Datei angezeigt.
  • Ich arbeite hier unter Windows-10-Pro Version 2004 mit Xbase 2.0 Built 1176.
Bleibt noch zu erwähnen, dass ich seit 27 Jahren Clipper und seit einem Jahr Xbase nutze und mich nicht erinnere, je ein Problem mit DIRECTORY() gehabt zu haben.

Liebe Grüße, bleibt gesund

Martin
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 455
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 15 Mal
Danksagung erhalten: 70 Mal
Kontaktdaten:

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von Marcus Herz »

Was pssierrt denn wenn du in einer Commandozeile

dir test\862*.jpg

eingibst?
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Dann wird mir nur eine - die richtige - Datei angezeigt.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2269
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 39 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von ramses »

Versuch doch mal den korrekten voll ausgeschriebenen Pfad zu verwenden:

arr := directory( "c:\test\862*.jpg")
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12641
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von AUGE_OHR »

hi,
komnick hat geschrieben: Mi, 11. Aug 2021 15:23 ich beobachte gerade in einem Einzelfall ein völlig verrücktes Verhalten des Befehls DIRECTORY():
interessant :shock:

habe es mal simuliert

Code: Alles auswählen

#include "Fileio.ch"

PROCEDURE MAIN()
LOCAL aFiles := {}, i
LOCAL nHandle

   AADD(aFiles,"86020200630.JPG")
   AADD(aFiles,"86120200630.JPG")
   AADD(aFiles,"86220200630.JPG")
   AADD(aFiles,"86320200630.JPG")
   AADD(aFiles,"86420200630.JPG")
   AADD(aFiles,"86520200630.JPG")
   AADD(aFiles,"86720200630.JPG")
   AADD(aFiles,"86720200819.JPG")
   AADD(aFiles,"86720201023.JPG")
   AADD(aFiles,"86720210114.JPG")
   AADD(aFiles,"86720210702.JPG")
   AADD(aFiles,"86820200630.JPG")
   AADD(aFiles,"86920200630.JPG")

   FOR i := 1 TO LEN(aFiles)
      nHandle := FCreate( aFiles[i], FC_NORMAL )
      FWrite( nHandle, "Jimmy" )
      FClose( nHandle )
   NEXT

   aDir := DIRECTORY("862*.JPG")
   Msgbox ( VAR2CHAR(aDir) )
RETURN

#IFDEF __XPP__
#ELSE
FUNCTION MsgBox(x)
RETURN MsgInfo(x)

FUNCTION VAR2CHAR( cIn )
LOCAL cOut := hb_valToExp( cIn )
   RETURN STRTRAN( cOut, '"', '' )
#ENDIF
wie ihr seht hab ich es nicht nur unter Xbase++ versucht aber erhalte jedes mal 2 Files ... auch bei einem normalen DIR
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12641
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von AUGE_OHR »

hi,

ich habe wegen DIRECTORY() mal in den PDRs gesucht und PDR 5570 gefunden ->

a.) mit 8.3 funktioniert es
b.) wenn man einen Buchstaben als 1st. hat geht es auch mit "LongName"
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2269
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 39 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von ramses »

Schon echt krass!!

Es sind jedoch nur Windows Filesysteme betroffen. Ist das Laufwerk mit den Dateien eine Ram-Disk oder befindet es sich auf einem Unix Server tritt das Problem nicht auf.

Mit Filesystem auf Windows 10 und Windows Server 2019 ist es perfekt nachvollziehbar.
Valar Morghulis

Gruss Carlo
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 359
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 2 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von azzo »

Hallo Jimmy,

danke. Auch unter xHarbour erhalte ich 2 Dateien.
Man müsste nun zuerst nach "*.*" suchen und dann einen Filter auf das erhaltene ARRAY.
Wie kann man ein Array am schnellsten "filtern"?

LG
Otto
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12641
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von AUGE_OHR »

hi,

wenn ich Powershell starte bekomme ich mit DIR 862* nur 1 x Treffer, mit NTVDM und CMD 2 x Treffer
PS C:\hmg.3.4.4\0\Directory> dir 862*

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 12.08.2021 07:41 5 86220200630.JPG

C:\hmg.3.4.4\0\Directory>dir 862*

12.08.2021 07:41 5 86220200630.JPG
12.08.2021 07:41 5 86720210702.JPG
p.s. wenn ich mich richtig "erinnere" trifft es auch für "Ordner" zu ... bei Kunden-Nummer als "Ordner" hatte ich auch mal so ein Problem
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12641
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 16 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von AUGE_OHR »

hi,
azzo hat geschrieben: Do, 12. Aug 2021 7:50 Auch unter xHarbour erhalte ich 2 Dateien.
auch in der CMD Box ( NICHT Powershell ) bekommt man 2 x Dateien
azzo hat geschrieben: Do, 12. Aug 2021 7:50 Man müsste nun zuerst nach "*.*" suchen und dann einen Filter auf das erhaltene ARRAY.
Wie kann man ein Array am schnellsten "filtern"?

Code: Alles auswählen

#include "Directry.ch" 
LOCAL aDir, aResult := {}, nStart := 1

   aDir := DIRECTORY( "*.BMP" )
   DO WHILE nPosi > 0
      nPosi := ASCAN(aDir,{ |x| x{F_NAME] = cSeek }, , nStart)
      IF nPosi > 0
         nStart := nPosi +1
         // im Array aufnehmen
         IF &(cBedingung) $ aDir [nPosi] [F_NAME]
            AADD(aResult , aDir [nPosi] [F_NAME]
         ENDIF
      ELSE
         EXIT
      ENDIF   
   ENDDO      
gruss by OHR
Jimmy
Benutzeravatar
azzo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 359
Registriert: So, 28. Mär 2010 19:21
Danksagung erhalten: 2 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von azzo »

Danke.
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Hallo allerseits,

vielen Dank euch allen, insbesondere an Jimmy für's fleißige Testen und Nachvollziehen!

Ein wirklich verrückter Fehler; es ist kaum zu glauben!

Marcus, den von dir vorgeschlagenen Test (dir test\862*.jpg) hatte ich in der Powershell gemacht. Wie Jimmy schreibt (ich habe es jetzt ebenfalls ausprobiert), kommt man in der CMD-Box zu einem anderen Ergebnis: Dort werden zwei Dateien angezeigt, also auch die falsche.

Carlo, auch bei dem von dir vorgeschlagenen Test (arr := directory( "c:\test\862*.jpg")) tritt der Fehler auf.

Ich habe mir jetzt erst einmal beholfen, indem ich das von DIRECTORY() zurückgegebene Array in jener Funktion anders auswerte, die mit diesen Dateien auf dem betroffenen Verzeichnis arbeitet.

Beste Grüße, bleibt gesund

Martin
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Noch eine Anmerkung:

Man könnte jetzt auf die Idee kommen, dass aufgrund dieses Fehlers bei
dirarray := DIRECTORY("TEST\867*.JPG")
die Datei 86720210702.JPG nicht gefunden wird.

Das ist zum Glück nicht der Fall.
86720210702.JPG wird korrekt gefunden.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2269
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 39 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von ramses »

Du könntest aber auch alle Files umbenennen und ein Buchstabe vorne hin setzen dann geht es auch ohne Probleme. Umbenennen geht natürlich nur wenn du / deine App die "Datenhoheit" hat.
Valar Morghulis

Gruss Carlo
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Das hätte ich vor einem Jahr wissen sollen; da wäre das noch gegangen.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2269
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 39 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von ramses »

Ich würde dennoch versuchen den Weg mit umbenennen zu gehen und die Machbarkeit abklähren.
So könntest du das Problem beseitigen andernfalls hast du keine Krücke.
Mit der Krücke und dem Verrückten Verhalten von Directory() müsstest du die nächsten Jahre leben .....

Oder die Daten auf einen *nix Server legen. z.B. Freebsd beim Zugriff darauf arbeitet Directory() fehlerfrei.
Jedoch benötigt der Einstieg zur Einarbeitung auch seine Zeit und die Kunden müssen auch mitmachen wollen.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Frank Grossheinrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 71
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Kirchheim an der Weinstraße
Hat sich bedankt: 1 Mal
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von Frank Grossheinrich »

Hallo Zusammen,

der PDR https://www.alaska-software.com/scripts ... PDRID=5570 beschreibt das Problem ja ganz gut. Es liegt weniger an Xbase++, sondern an der Win API Funktion FileFindFirst()/FileFindNext(), die Xbase++ (und anscheinend auch CMD) hier verwendet.

Und ich rate auch eher, dass man die Dateinamen ändert, denn der Fehler ist schon so lange in Windows, dass ich hier nicht mehr mit einem Fix rechne.

Grüße, Frank
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8572
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 27 Mal
Danksagung erhalten: 110 Mal
Kontaktdaten:

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von Tom »

Hallo, Frank.

Ist das im PDR geschilderte Szenario wirklich das, um das es hier geht? Dort ist die Rede davon, dass Dateinamens-Suffixe, die länger als drei Buchstaben sind, aber in Bezug auf diese drei Buchstaben übereinstimmen, von der API-Funktion nicht unterschieden werden können. Hier ist aber die Rede davon, dass im Korpus des Dateinamens Übereinstimmungen gefunden werden.

Wobei, ich denke, ich kenne die Antwort selbst. Die abstrakten 8.3-Namen, die Windows bildet, um im entsprechenden Namespace das Pendant für einen längeren Namen abzulegen, also den LFN dort zu spiegeln, werden nach bestimmten Regeln gebildet, die hier vermutlich scheitern. Es wird also am Algorithmus für die Bildung der 8.3-Variante zu LFNs liegen, der in seltenen Fällen auch beim Korpus zwei gleiche Varianten erzeugt.
Herzlich,
Tom
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Hallo miteinander,

laut PDR 5570 schreibt DIRECTORY() also eventuell Dateien ins Array, welche die Maske nicht erfüllen.
Der umgekehrte Fall (dass DIRECTORY() Dateien nicht ins Array schreibt, obwohl sie die Maske erfüllen) kommt hingegen nicht vor.

Demnach wäre Ottos Vorschlag, nach *.* zu suchen und selber zu filtern, nicht nötig. Es genügt, DIRECTORY() mit der gewünschten Maske zu benutzen und "nachzufiltern" bzw. für die gefundenen Elemente noch einmal zu prüfen, ob sie die Maske erfüllen.

Mal abgesehen davon, dass eine Änderung der Dateinamen in meinem Fall nicht praktikabel ist: Ich kann dem PDR nicht entnehmen, dass der Fehler nicht auch auftreten könnte, wenn ich vor jeden Dateinamen noch einen Buchstaben setze...

Beste Grüße, bleibt gesund

Martin
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8572
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 27 Mal
Danksagung erhalten: 110 Mal
Kontaktdaten:

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von Tom »

Hallo, Martin.

Es handelt sich offenbar um ein Problem, das damit zu tun hat, wie der Windows-Algorithmus aus LFNs die 8.3-Dateinamen errechnet. Zuweilen können zwei oder mehrere Dateien tatsächlich auf dem gleichen 8.3-Namen landen, etwa bei Suffixen mit mehr als drei Buchstaben, wie im PDR erklärt, aber auch beim "Vornamen", aus dem ja ebenfalls eine Kurzversion errechnet wird - das Ding mit der Tilde im Namen, die man in 16-Bit-Apps sieht. Der Algorithmus kann ja ohnehin unmöglich zu jedem LFN einen eindeutigen 8.3-Namen errechnen, und hier ist offenbar ein Beispiel dafür gefunden worden, wo zwei LFNs den gleichen 8.3-Namen haben. Da die API aber immer in beiden Tabellen sucht, also in den LFNs und in den 8.3ern, und dann aber aus der Tabelle mit den LFN antwortet, gibt es diese irritierenden Treffer. So verstehe ich das jedenfalls.
Herzlich,
Tom
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von komnick »

Hallo Tom,

ja, so habe ich es auch verstanden.

Ich kann aber nicht glauben, dass es eine Lösungsstrategie sein kann, vor meine aus Ziffern bestehende Dateinamen noch einen Buchstaben zu setzen, wie es Carlo vorschlug, denn dann würden doch noch immer diese abstrakten, ggf. nicht eindeutigen 8.3-Namen gebildet.

Daher scheint mir die einzige Lösung, die Elemente des erzeugten Arrays noch einmal zu prüfen ("auszusieben").

Beste Grüße, bleibt gesund

Martin
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2269
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 10 Mal
Danksagung erhalten: 39 Mal

Re: Verrücktes Verhalten von DIRECTORY()

Beitrag von ramses »

komnick hat geschrieben: Fr, 13. Aug 2021 14:53 Daher scheint mir die einzige Lösung, die Elemente des erzeugten Arrays noch einmal zu prüfen ("auszusieben").
Nein nicht ganz. Du könntest die Daten auch auf einen *nix Server (Linux Unix) legen die kennen das Problem nicht.
Der Zugriff mit Directory() von einem Windows Rechner liefert die korrekten Einträge zurück.
Valar Morghulis

Gruss Carlo
Antworten