# Dateien in Ordner Zählen



## Hocheck (5 Oktober 2009)

Hallo,
Ich wäre sehr froh um einen weiteren Rat von euch

Ich habe einen Ordner in den ich erfolgreich, dank eurer Hilfe, excel und txt Dateien schreiben kann. Auch ein Verbindungstest habe ich hinbekommen.

Nun hänge ich an der Umsetzung den Ordnerinhalt als "Archiv" am Panel anzeigen zu lassen

Wie kann man die vorhandenen Dateien in einem Ordner am PC zählen und dieses Ergebnis im VBS benutzen? ist das überhaupt möglich?
Ich bräuchte das für die For schleife im Programm unten...

Brauche das weil man nicht die Anzahl der gespeicherten Dateien auf dem PC kennt in unserem Fall..

folgenden Code von PN/DP habe ich benutzt und kann schon mal die 20 Dateinamen anzeigen, aber auch nur wenn 20 Dateien im Ordner am PC drin sind, bei weniger geht es nicht.


----------



## Hocheck (5 Oktober 2009)

'für WinCE
Dim fso, result, string_array(20), i, o, wert

Set fso = CreateObject("FileCtl.FileSystem")
result = fso.Dir("\\path\*.*")
string_array(0) = result

For i = 1 To 20
result = fso.Dir() 'oder fso.Dir() ?
string_array(i) = result

Next

SmartTags("DB_LAN.Feld[1]")= string_array(1) 
SmartTags("DB_LAN.Feld[2]")= string_array(2)
SmartTags("DB_LAN.Feld[3]")= string_array(3)


----------



## volker (5 Oktober 2009)

*vb-script verzeichnis nach verzeichnis / datei durchsuchen*

ich nehme mal an, das bei weniger als 20 dateien das script mit einem fehler abbricht.

das das script auf jeden fall zu ende läuft, kannst du mit folgender zeile erreichen
*on error resume next* 'nach einem fehler wird einfach das script hinter dem fehler fortgeführt
wie man den fehler auswertet schau auch mal hier

inwieweit sich folgendes script auf wce umsetzen lässt kann ich im moment nicht sagen.

```
'dieses vb-script sucht alle ordner/dateien beginnend mit dem startordner.'
'für windows basierende systeme'

'hauptprogramm'
Set fso = CreateObject("Scripting.FileSystemObject")
Subsearch Verz
wscript.quit

'unterordner suchen--------------------------------------------------'
Sub SubSearch(Byval Verz)
    filesearch verz

    Set Weitere = Verz.SubFolders
    For Each AktuellerOrdner In Weitere
        i=instr(AktuellerOrdner,"Temporary Internet Files")
        if i = 0 then SubSearch AktuellerOrdner
    Next
End Sub

'ordner durchsuchen--------------------------------------------------'
Sub Filesearch(Byval AktuellerOrdner)
    Set Dateien=AktuellerOrdner.files
    Set ordner=AktuellerOrdner.subfolders
    dieserordner=fso.getfolder(aktuellerordner)

'ordner die in diesem ordner sind'
    For Each Datei in ordner
        groesse="VERZEICHNIS"
        TextFile1.Writeline datei.name & "·" & groesse
    Next

'dateien in diesem ordner'
    For Each Datei in Dateien
            groesse=(datei.size)
            groesse=int(groesse/1024)
            TextFile1.Writeline datei.name & "·" & groesse
        end if
    Next
End Sub
```


----------



## PN/DP (5 Oktober 2009)

*verfeinertes Programmbeispiel*

Hallo Hocheck,


Hocheck schrieb:


> folgenden Code von PN/DP habe ich benutzt und kann schon mal die 20 Dateinamen anzeigen, aber auch nur wenn 20 Dateien im Ordner am PC drin sind, bei weniger geht es nicht.


Was heißt "geht es nicht"? Du bekommst doch bestimmt eine konkrete Fehlermeldung? 
Sicher geht das Lesen der Dateinamen, Dein Script wird aber wahrscheinlich abgebrochen, bevor Du
die Ergebnisse in die Panelvariablen kopiert hast.

Es geht hier um dieses Programmbeispiel:
http://www.sps-forum.de/showthread.php?p=218587#post218587

```
'für WinCE
Dim fso, result, string_array(40), i

Set fso = CreateObject("FileCtl.FileSystem")
result = fso.Dir("\\pcname\freigabeordner\*.*")
string_array(0) = result
For i = 1 To 40
    if result = "" Then Exit For  '(das [COLOR="Blue"]Then[/COLOR] hatte ich vergessen)
    result = fso.Dir              'oder fso.Dir() ?
    string_array(i) = result
Next

'string_array noch irgendwie ausgeben
'oder gleich in 40 panel-interne String-Variablen einlesen?
```
Leider hast Du eine wichtige Anweisung in der Schleife weggelassen: *if result = "" Then Exit For*
Deshalb bekommst Du wahrscheinlich eine Fehlermeldung, wenn weniger Dateien als Schleifendurchläufe
vorhanden sind.
Also, ein bischen muß man die angebotenen Programmbeispiele auch selber durchdenken und verstehen.

Die For-Schleife habe ich im Beispiel benutzt, um die MAXIMALE Anzahl an Schleifendurchläufen 
einfach festzulegen. Genau so viele + 1 interne Panel-Variablen für die Dateinamen mußt Du ja auch 
vorher angelegt haben. Das Script liest solange Dateinamen, bis es keine mehr gibt oder maximal 
41 Dateien gefunden wurden. Der erste gefundene Dateiname steht in string_array(0)!

Die Methode fso.Dir() muß beim ersten mal mit einem Suchmuster als Parameter aufgerufen werden. 
Danach muß fso.Dir() ohne Parameter maximal so oft aufgerufen werden, bis kein passender Dateiname 
mehr zurückgeliefert wird, result also ein Leerstring "" ist. Dann muß das Abrufen beendet werden.
Das steht aber auch so in der immer wieder angeführten *VBScript_WinCE.pdf* im FAQ von Volker.


> You must specify _pathname_ the first time you call the *Dir* method. [...]
> The Dir method returns the first file name that matches _pathname_. To get any additional file names
> that match pathname, call *Dir* again with no parameters. When no more file names match, *Dir* returns
> a zero-length string (""). Once a zero-length string is returned, you must specify _pathname_ in
> subsequent calls.



Also noch einmal:
FAQ: Protool/WinCCflex Daten lesen / schreiben mit VB-Script
siehe besonders die im ersten Beitrag unten angehängte *VBScript_WinCE.pdf*


(Ich weiß jetzt nicht, ob der Dir-Aufruf ohne Parameter mit leerer Klammer oder ohne Klammer 
geschrieben werden muß. Ich habe es halt nicht getestet.)

Nach der Suchschleife steht in i, wieviele Dateinamen gefunden wurden.
Damit das Script einsatztauglich wird, müsste nach der Schleife string_array(i) bis string_array(40)
noch mit Leerstring "" belegt werden, falls weniger als 40 Dateien gefunden wurden.


Ich bin mir nicht sicher, aber wahrscheinlich kann der Variablenname der internen Panel-Variablen
zur Laufzeit des Scriptes zusammengesetzt werden und Du kannst statt in string_array(i) gleich 
in Deine Panel-Variablen "DB_LAN.Feld_" schreiben. Einfach mal ausprobieren!


So könnte das fertige Script für 20 Dateinamen in "DB_LAN.Feld[1]" bis "DB_LAN.Feld[20]" aussehen 
(wenn WinCC flexible nichts dagegen hat):


		Code:
	

[COLOR="Green"]'Dateinamen aus einem Ordner lesen
'für WinCE[/COLOR]
[COLOR="Blue"]Const[/COLOR] MaxAnzahl = 20   [COLOR="Green"]'maximale Anzahl zu lesender Dateinamen[/COLOR]
[COLOR="blue"]Dim [/COLOR]fso, result, tagname, i

[COLOR="blue"]Set [/COLOR]fso = [COLOR="Blue"]CreateObject[/COLOR]([COLOR="DarkRed"]"FileCtl.FileSystem"[/COLOR])
result = fso.Dir([COLOR="darkred"]"\\pcname\freigabeordner\*.*"[/COLOR])
[COLOR="DimGray"]SmartTags[/COLOR]([COLOR="DarkRed"]"DB_LAN.Feld[1]"[/COLOR]) = result
[COLOR="blue"]For [/COLOR]i = 2 [COLOR="blue"]To [/COLOR]MaxAnzahl
    [COLOR="blue"]If [/COLOR]result <> [COLOR="darkred"]""[/COLOR] [COLOR="blue"]Then [/COLOR]result = fso.Dir   [COLOR="green"]'oder fso.Dir() ?[/COLOR]
    tagname = [COLOR="DarkRed"]"DB_LAN.Feld["[/COLOR] & i & [COLOR="darkred"]"]"[/COLOR]
    [COLOR="DimGray"]SmartTags[/COLOR](tagname) = result
[COLOR="blue"]Next[/COLOR]


Die Programmvariante von Volker in #3 ist auch recht interessant, wenn man ALLE Dateinamen aus einem
Ordner auslesen muß. Danach müsste man "nur" noch die erzeugte Textdatei zeilenweise anzeigen und 
ggf. scrollen.

Gruß Harald_


----------



## Hocheck (7 Oktober 2009)

Vielen Vielen Dank für eure Hilfe,
Ist ja nicht selbstverständlich. Mein Problem ist dass ich keinen hier an der FH habe, der das VBS in Verbindung mit WinCC kann...
Ich lese und probiere, finde aber alleine leider keine rechte Lösung...

Dein Skript hat einwandfrei funktioniert, um den Ordner auslesen zu können muss man fso.Dir() benutzen!

Ich komme einfach nicht mehr weiter. Vielleicht geh ich die Sache auch einfach komplett falsch an.

Die Situation gesamt:
Auf dem Panel gibt es ein Programmarchiv(DB) für Maschinenparameter.
Als "Programm Kopf" dient eine Programmnummer und eine Programmbezeichnung, was in einer Tabelle im Panel angezeigt wird:

Feld mit 2 Strings                         Feld mit 14 Strings                          
Programmnummer                        Programmbezeichnung
     1  (DB.LAN_nummer[1])                     Test (DB.LAN_Feld[1])   
     2                                                   Test1

Diese Daten sollen mit Skript auf einem PC gesichert werden- was ich ja dank eurer Hilfe schon hinbekomme.

Nur wie kriege ich die richtige Anzeige der Daten hin?
Ich speicher die .txt Dateien unter diesem Dateinamen:
Programmnummer.Programmbezeichung.txt 
    2 Strings             14 Strings

Ich würde gerne eine Auswahl haben, die mir zb eine Datei die als 5.Test.txt gespeichert wurde auch automatisch unter der Programm Nummer "5" gespeichert wird und nur die Bezeichnung "Test" unter Programmbezeichnung gespeichert wird...
Der Speicherpfad soll variabel sein.


Ich hatte es schon mit der Split Funktion probiert aber ich versteh es einfach nicht

Momentan so, aber das läuft nicht richtig und gibt auch Probleme ab Prog.Nr 10....

Meldung:
Fehler: 20010 tag lookup only by name

Dim i, result, pfad, tagname, zeichen, platz, fso
Const maxanzahl = 20
'tagname = Right("5Test",5)
platz= "\\PC\MP277\*.txt"
Set fso = CreateObject("FileCtl.FileSystem") 
result = fso.Dir(platz)
 SmartTags("DB_LAN.Feld[1]") = result

 For i = 2 To maxanzahl
   If result <> "" Then result = fso.Dir()    'oder fso.Dir() ?  
    tagname = Right(result,5)  
     If tagname = "1" Then zeichen = 1
  If tagname = "2" Then zeichen = 2
  If tagname = "3" Then zeichen = 3
  If tagname = "4" Then zeichen = 4
  If tagname = "5" Then zeichen = 5
  If tagname = "6" Then zeichen = 6
  If tagname = "7" Then zeichen = 7
  If tagname = "8" Then zeichen = 8
  If tagname = "9" Then zeichen = 9
  If tagname = "10" Then zeichen = 10
 If zeichen = i Then pfad = SmartTags("DB_LAN.Feld[" & i & "]")
    SmartTags(pfad) = result


----------



## xhasx (8 Oktober 2009)

*Hier mal ein Auszug aus meinem "FileBrowser"*


```
' Ordner suchen
 If OrdnerVorhanden Then
  Set Ordnern = f.SubFolders
  i = 0
  j = 0
  ' Ordner: Anzahl
  SmartTags("Anlage\FileBrowser\OrdnerAnzahl") = f.SubFolders.Count
  For Each Ordner In Ordnern
   i = i + 1
   'Fenster: Listenfelder: Ordnernamen kopieren
   If (i>=SmartTags("Anlage\FileBrowser\OrdnerAnzeigeSeite")*OrdnerListenfelder+1)And (i<=SmartTags("Anlage\FileBrowser\OrdnerAnzeigeSeite")*OrdnerListenfelder+OrdnerListenfelder) Then
    j = j +1
    VarName = "Anlage\FileBrowser\Ordner" & j
    SmartTags(VarName) = Ordner.Name  
   End If
  Next
  'Listenfelder: Anzahl (Fenster: Listenfelder: Sichtbarkeit)
  SmartTags("Anlage\FileBrowser\OrdnerListeAnzahl") = j  
  'Seitenwechsel: Pfeil ab: Sichtbarkeit
  If (i > (SmartTags("Anlage\FileBrowser\OrdnerAnzeigeSeite") * OrdnerListenfelder + j)) Then
   SmartTags("Anlage\FileBrowser\OrdnerSeitePfeilAbAnzeige") = True 
  End If  
 End If
```


----------

