matzetto
Goto Top

Dateiname auf bestimme Zeichenfolge überprüfen?

Hallo Experten,

leider komme ich bei einer bestimmten Problematik in meinem aktuellen Projekt nicht weiter und wollte daher hier um Hilfe bitten.
Ich möchte im Prinzip nichts weiter machen als zu testen ob in einem bestimmten Verzeichnis Dateien vorhanden sind,
die eine bestimmte Zeichenfolge im Namen haben. Wenn diese Zeichenfolge bzw. wenn eine von zwei verschiedenen Zeichenfolgen (VOK oder TOK), in einer
oder mehreren Dateien im Namen vorkommt, soll eine Warnung wie: "Achtung, keine weiteren Schritte einleiten" kommen. Wenn keine Datei
mit diesen Zeichenfolgen existiert dann soll zum Beispiel: "Alles Okay" ausgegeben werden.

Zum Beispiel:

Das Verzeichnis C:\Dokumente enthält folgende Dateien:

22062016VOK_004.056
test.txt
Präsentation.xms
Seite1.aspx

Dann Sollte jetzt beim anklicken der Anwendung, wie oben beschrieben, eine Ausgabe wie "Achtung..." kommen.

Ich habe in verschiedenen Foren und anderen Seiten gelesen, das dies gut mit VBS oder C++ realisierbar sein soll, jedoch
habe ich bisher nur Lösungsansätze gefunden die den Typ der Datei oder den gesamten Dateinamen überprüfen und nicht
den Dateinamen auf eine bestimmte Zeichenkombination testen. Das Problem hierbei ist auch, dass Dateityp und Länge der
Dateinamen immer variieren, d.h. die Zeichenfolgen VOK oder TOK sind die einzigen konstanten auf die ich testen kann
um mein Ziel zu erreichen. Leider bin ich bisher nicht sonderlich weit gekommen und habe nur Testweise an verschiedenen VBS
Codes herumprobiert, jedoch habe ich dort noch keine Lösung gefunden.
Falls es wichtig sein sollte, ich arbeite mit Win10 64bit, die Anwendung soll auf allen Windows Betriebssystemen ab Win7 aufwärts laufen können.
Idealerweise wäre es auch gut wenn man das ganze im IE oder anderen Browsern darstellen könnte, das ist jedoch nicht
zwingend erforderlich.
Ich wäre sehr dankbar für jeden Hinweis in welcher Sprache und wie sich das ganze am einfachsten lösen lässt. Vielleicht
findet ja jemand etwas im Web was ich übersehen habe oder jemand macht sich sogar die Mühe etwas zusammen
zu basteln. Alle Vorschläge sind willkommen und danke im Voraus.

matzetto

Content-Key: 317433

Url: https://administrator.de/contentid/317433

Printed on: April 23, 2024 at 07:04 o'clock

Mitglied: 131026
Solution 131026 Oct 11, 2016 at 10:00:47 (UTC)
Goto Top
Hallo,
Ich wäre sehr dankbar für jeden Hinweis in welcher Sprache und wie sich das ganze am einfachsten lösen lässt.
Mit jeder! Was brauchst du denn bzw. was hast du bereits an Code ?
Mit VBS durchläufst du den Ordner mit einer Schleife und prüfst den Dateinamen mit Instr() oder über Reguar Expressions.
Ich könnte dir jetzt hier Beispiele in allen Sprachen rein kloppen aber das wäre nicht zielgerichtet.
Du solltest dich schon auf eine Sprache festlegen face-confused

Gruß R.
Member: matzetto
matzetto Oct 11, 2016 at 10:26:11 (UTC)
Goto Top
Hi ranger,

erst mal danke für deine Anwort. Ich hätte an VBS gedacht weil ich gelesen hab das man dies gut in eine html Seite einbinden kann um das ganz im
Browser darzustellen. In C++ habe ich bisher nur von der Möglichkeit gelesen in einem Ordner auf Existenz von Dateien zu prüfen.

In VBS hatte ich bisher mit folgendem Code ausgetestet:

Set fso = CreateObject("Scripting.FileSystemObject")  
strOrdner = "C:\Dokumente"  
aTypen = Array("VOK", "TOK")  

For Each sTyp In aTypen
	iAnz = 0
	For Each oFile In fso.GetFolder(strOrdner).Files
		If LCase(fso.GetExtensionName(oFile.Path)) = sTyp Then
			iAnz = iAnz + 1
		End If
	Next
	Select Case iAnz
	Case 0
		WScript.Echo "Sie können problemlos fortfahren!"  
	Case 1
		WScript.Echo "Achtung! Es ist noch eine alte Datei vorhanden!"  
	Case Else
		WScript.Echo "Achtung! Es sind noch alte Dateien vorhanden!"  
	End Select
Next

Dazu möchte ich sagen das ich wenig Ahnung von VBS habe und mir dies aus verschiedenen Beispielen zusammen gebastelt habe, jedoch ist hier das Problem, dass auf die Dateiendung geprüft wird. Theoretisch würde es ja reichen wenn ich den Dateinamen in einen String konvertiere bzw. ihn als String auslese und den dann auf bestimmte Zeichenfolgen teste, und entsprechend des Ergebnisses meine Ausgabe formuliere. Ich vermute das der Instr() Befehl den du bereits erwähntest dazu genutzt werden kann oder nicht?
Mitglied: 131026
Solution 131026 Oct 11, 2016 updated at 10:50:10 (UTC)
Goto Top
Folgenden Text in einer Datei mit der Endung *.hta speichern, Pfade und Suchwörter anpassen (siehe Code-Kommentare) und dann drauf Doppelklicken.

<html>
<head>
<title>My HTML application</title>
<HTA:APPLICATION
  APPLICATIONNAME="My HTML application"  
  ID="MyHTMLapplication"  
  VERSION="1.0"/>  
</head>
<style>
.warning {
	color:red;
	font-weight:bold;
	font-size: 30px;
}
.OK {
	color:green;
	font-weight:bold;
	font-size: 30px;
}
</style>
<script language="VBScript">  
	Dim fso
	
	Sub Window_OnLoad
		Dim extensions,el
		' Fenstergröße anpassen  
		window.resizeTo 500,200 
		' Dateisystemobjekt  
		Set fso = CreateObject("Scripting.FileSystemObject")  
		'Ordner der durchsucht wird  
		Const SEARCHFOLDER = "D:\Datenordner"  
		'Zu suchende Dateierweiterungen  
		extensions = Array("txt","xml")  
		' Zu suchenden String im Dateinamen  
		searchstring = "Das suche ich"  
		'Ausgabe-Element suchen  
		Set el = document.getElementById("alert")  
		
		If CheckFiles(SEARCHFOLDER,extensions,searchstring) Then
			el.innerText = "Achtung! Es ist noch mindestens eine alte Datei vorhanden!"  
			el.className = "warning"  
		Else
			el.innerText = "Sie können problemlos fortfahren!"  
			el.className = "OK"  
		End If
	End Sub
	
	'Funktion die Dateien sucht und im Erfolg True zurückgibt, ansonsten False.  
	Function CheckFiles(folder,extensions,searchstring)
		For Each file In fso.GetFolder(folder).Files
			For Each ext In extensions
				If LCase(fso.GetExtensionName(file.Name)) = LCase(ext) And InStr(1,file.Name,searchstring,1) > 0 Then
					CheckFiles = True
					Exit Function
				End If
			Next
		Next
		CheckFiles = False
	End Function
</script>
<body bgcolor="white">  
<div id="alert"></div>  
</body>
</html>
screenshot

screenshot
Member: matzetto
matzetto Oct 11, 2016 at 11:21:33 (UTC)
Goto Top
Danke ranger das funktioniert soweit erst mal super, danke dafür.
Jetzt habe ich jedoch das Problem, dass die Dateien die ich überprüfe eine Namenserweiterung zwischen .000 bis .999
haben können. Hier gibt es doch bestimmt die Möglichkeit mit einer For Schleife und einem Zähler das Array für die Extension
anzupassen. Meine Idee wäre jetzt folgende gewesen:
i=0
		For i < 1000
		extensions = Array(i)
		i=i+1
		Next
Jedoch bekomme ich hier einen Syntaxerror. Außerdem besteht ja eine Dateierweiterung immer aus drei Zeichen. Hast du hier evtl.
einen Lösungsansatz?
Mitglied: 131026
Solution 131026 Oct 11, 2016 updated at 13:06:57 (UTC)
Goto Top
Würde ich eher direkt mit "Regular Expressions" machen:
<html>
<head>
<title>My HTML application</title>
<HTA:APPLICATION
  APPLICATIONNAME="My HTML application"  
  ID="MyHTMLapplication"  
  VERSION="1.0"/>  
</head>
<style>
.warning {
	color:red;
	font-weight:bold;
	font-size: 30px;
}
.OK {
	color:green;
	font-weight:bold;
	font-size: 30px;
}
</style>
<script language="VBScript">  
	Dim fso,regex
	
	Sub Window_OnLoad
		Dim extensions,el
		' Fenstergröße anpassen  
		window.resizeTo 500,200 
		' Dateisystemobjekt  
		Set fso = CreateObject("Scripting.FileSystemObject")  
		Set regex = CreateObject("vbscript.regexp")  
		regex.IgnoreCase = True
		
		'Ordner der durchsucht wird  
		Const SEARCHFOLDER = "A:\"  
		'Ausgabe-Element suchen  
		Set el = document.getElementById("alert")  
		
		If CheckFiles(SEARCHFOLDER,searchstring) Then
			el.innerText = "Achtung! Es ist noch mindestens eine alte Datei vorhanden!"  
			el.className = "warning"  
		Else
			el.innerText = "Sie können problemlos fortfahren!"  
			el.className = "OK"  
		End If
	End Sub
	
	'Funktion die Dateien sucht und im Erfolg True zurückgibt, ansonsten False.  
	Function CheckFiles(folder,searchstring)
		regex.Pattern = ".*?(VOK|TOK).*\.\d{3}$"  
		For Each file In fso.GetFolder(folder).Files			
			If regex.Test(file.Name) Then
				CheckFiles = True
				Exit Function
			End If
		Next
		CheckFiles = False
	End Function
</script>
<body bgcolor="white">  
<div id="alert"></div>  
</body>
</html>
Member: matzetto
matzetto Oct 11, 2016 at 12:34:34 (UTC)
Goto Top
Das funktioniert echt gut. Danke für deine schnellen Antworten. Nun habe ich jedoch noch eine letzte Frage, ich hoffe du kannst mir verzeihen. ^^
Der Code den du mir geschickt hast funktioniert soweit super und ich verstehe ihn auch. Ich möchte ja nun die Ausgabe, also ob alles ok ist oder noch
veraltete Daten vorhanden sind davon abhängig machen ob Dateien mit dem in searchstring definierten Wert im Namen vorhanden sind. Das funktioniert auch soweit. Jedoch habe ich ja zwei Strings von denen ich es abhängig machen will nämlich VOK und TOK, muss ich jetzt hier also die Anwendung quasi zwei mal durchlaufen lassen mit einer entsprechenden searchstring2 Variable für meinen anderen Wert oder kann ich irgendwie in die Bedingungen für die For Schleifen das zweite Argument noch mit einbinden. Ein einfaches definieren des zweiten Strings und dessen Variable in die Bedingung einzufügen funktioniert leider nicht. Hier kommt der Fehler das zu viele Argumente vorhanden sind.
Mitglied: 131026
Solution 131026 Oct 11, 2016 updated at 13:09:32 (UTC)
Goto Top
Änderung siehe letzten Post, alles nun im Regex eingebaut ist sowieso besser.

Wie Regular Expressions aufgebaut sind siehe
https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/
Member: matzetto
matzetto Oct 11, 2016 at 13:22:48 (UTC)
Goto Top
Ich danke dir, es funktioniert jetzt einwandfrei so wie ich mir das vorgestellt habe!
Vielen dank!