Autor Thema: Durch Windows-Verzeichnis loopen, jew. Dateiname als Ergebnis?  (Gelesen 2014 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Hi,

ich will in einem Windows-Dir was abfragen.

Syntax:
DATEINAMEYYYY.endung

DATEINAME = Dateiname ohne Endung
YYYY = Nummer, hier Typ String, Beginn normalerweise bei 0001 und wird nicht größer als 9999 (also 4 stellige ganze Zahl)
endung = Endung wie gif, doc, nsf

Was will ich machen:

Ich brauche in dem Verzeichnis die Datei mit DATEINAME und .endung, bei der YYYY den größten Wert hat.

Bsp:

In einem Verzeichnis liegen folgende Dateien:
auswertung0003.txt
auswertung0012.txt
urlaub17.jpg
auswertung0006.txt
auswertung0011.txt

Ich habe in Variablen:
DATEINAME$ = "auswertung"
endung$ = "txt"

Nun benötige ich in einer Variablen das Ergebnis: wäre hier im Beispiel 0013, da diese größer als 0003 oder 0006, 0011 oder 0012 ist.

Wie komme ich zu der 0013?

String-Operatoren etc. in LS sind mir bekannt (inkl. Dir$). Evtl. würde ein Loop, Start 9999, Schrittweite -1, gehen in Verbindung mit Dir$, erscheint mir aber als Overkill.
Gibt's vielleicht eine einfache(re) Möglichkeit?

*Edit*
Kleinen Logikfehler korrigiert: als Ergebnis brauche ich 0013 nicht 0012, da ja 0012 bereits existiert :-)
« Letzte Änderung: 25.09.04 - 01:48:20 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Fakt ist ja erstmal, dass Du sowieso das ganze Verzeichnis erstmal auslesen musst (IMHO).
Wenn dann die "Endung" fix ist (also immer die letzten 4 Ziffern wie in Deinem Beispiel), dann kannst Du diese "Endung" auslesen und nur dann zwischenspeichern, wenn sie grösser ist als die zuletzt gespeicherte.
Sind die "Endungen" in ihrer Länge variable, musst Du vorher "van hinten" prüfen, wie lange Du IsNumeric pro Character bekommst und so wieder die "Endung" zusammenflöhen.

Das aber erstmal nur so als Schnellschuss und - vielleicht - Denkanstoss. Vielleicht hilft Dir das schon weiter ?

A propos "weiter": Bei mir dann, wenn es wieder heller draussen ist ;-)

Gute Nacht,

Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Danke.

Fakt ist ja erstmal, dass Du sowieso das ganze Verzeichnis erstmal auslesen musst (IMHO).
Hab mir auch gedacht, dass es am geschicktesten wäre, die Dir-Inhalte (also die Dateinamen) als Array vorliegen zu haben.
Die Aufbereitung / Zerlegung der Strings selbst: soweit kein Problem für mich.

Nur: wie komme ich zu einem solchen String-Array, am besten ohne API? Ich konnte da LS-mäßig leider nichts finden....

Gute Nacht,
Matthias
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Glombi

  • Gast
Ich würde es ohne Array machen. Hier mein nach dem ersten Kaffee schnell-Schuss Ansatz (einiges ist hardcodiert, aber es soll ja nur das Prinzip verdeutlichen):

Dim pathName As String, fileName As String
   pathName$ = "c:\test\*.*"
   
   Dim file_praefix As String
   Dim file_endung As String
   Dim maxNr As Integer
   Dim file_suffixNr As String
   Dim file_suffixInt As Integer
   
   file_praefix = "auswertung"
   file_endung = ".txt"
   
   maxNr = -1
   
   fileName$ = Dir$(pathName$, 0)
   Do While fileName$ <> ""
      
      If (Instr( fileName$, file_praefix ) > 0) And (Right$( fileName$, Len( file_endung )) = file_endung ) Then
         file_suffixNr = Strleft( Strright( fileName$, file_praefix ), file_endung )
         If Isnumeric( file_suffixNr  ) Then
            file_suffixInt = Cint( file_suffixNr )
            If file_suffixInt > maxNr Then
               maxNr = file_suffixInt
            End If
            
         End If
         
      End If
      
      fileName$ = Dir$()
   Loop
   
   Msgbox "Die nächst höhere Zahl ist " & Cstr( maxNr + 1 )
   

Andreas

Glombi

  • Gast
So nach dem 2. Kaffee sehe ich schon klarer  8)

Wenn es nur ein Präfix und eine Dateiendung ist (sonst müsstest Du im vorherigen Script noch ein paar If und Or einbauen) ist, geht es natürlich viel einfacher, in dem der Parameter für Dir$ bereits mit der Info und einer Wildcard gefüttert wird:

Dim pathName As String, fileName As String
   
   Dim file_praefix As String
   Dim file_endung As String
   Dim maxNr As Integer
   Dim file_suffixNr As String
   Dim file_suffixInt As Integer
   
   file_praefix = "auswertung"
   file_endung = ".txt"
   
   pathName$ = "c:\test\" & file_praefix & "*" & file_endung
   
   maxNr = -1
   
   fileName$ = Dir$(pathName$, 0)
   Do While fileName$ <> ""
      
      file_suffixNr = Strleft( Strright( fileName$, file_praefix ), file_endung )
      If Isnumeric( file_suffixNr  ) Then
         file_suffixInt = Cint( file_suffixNr )
         If file_suffixInt > maxNr Then
            maxNr = file_suffixInt
         End If            
      End If
      
      fileName$ = Dir$()
   Loop
   
   Msgbox "Die nächst höhere Zahl ist " & Cstr( maxNr + 1 )

Andreas

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Zitat
Kaffee schnell-Schuss Ansatz

Prima, hast sogar mehr gecoded als ich erwartet hätte  :D

Danke, so sollte es funktionieren - das Prinzip hab ich verstanden und klingt sehr sinnvoll!

Grüße,
Matthias
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Glombi

  • Gast
Bitte, gern geschehen  :D

Ich würde meinen 2. Ansatz weiter verfolgen. Der erste ist unperformant.

Andreas

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz