C# File Search

09/14/2013 22:20 Sedrika#1
Ich bin auf der Suche nach einer Methode wie ich Dateien aus einem Ordner anzeigen lassen kann, dabei folgende "SearchPattern" nutze.

Code:
world\wdMadrigal\WdMadrigal(2,00,04)-(2,00,04).lnd
2 steht für wie viele stellen es sein soll, die 00 und 04 für die Dateinummern.

Als Ausgabe möchte ich folgendes haben:
Quote:
world\wdMadrigal\WdMadrigal00-00.lnd
world\wdMadrigal\WdMadrigal00-01.lnd
world\wdMadrigal\WdMadrigal00-02.lnd
world\wdMadrigal\WdMadrigal00-03.lnd
world\wdMadrigal\WdMadrigal00-04.lnd

world\wdMadrigal\WdMadrigal01-00.lnd
world\wdMadrigal\WdMadrigal01-01.lnd
world\wdMadrigal\WdMadrigal01-02.lnd
world\wdMadrigal\WdMadrigal01-03.lnd
world\wdMadrigal\WdMadrigal01-04.lnd

world\wdMadrigal\WdMadrigal02-00.lnd
world\wdMadrigal\WdMadrigal02-01.lnd
world\wdMadrigal\WdMadrigal02-02.lnd
world\wdMadrigal\WdMadrigal02-03.lnd
world\wdMadrigal\WdMadrigal02-04.lnd

world\wdMadrigal\WdMadrigal03-00.lnd
world\wdMadrigal\WdMadrigal03-01.lnd
world\wdMadrigal\WdMadrigal03-02.lnd
world\wdMadrigal\WdMadrigal03-03.lnd
world\wdMadrigal\WdMadrigal03-04.lnd

world\wdMadrigal\WdMadrigal04-00.lnd
world\wdMadrigal\WdMadrigal04-01.lnd
world\wdMadrigal\WdMadrigal04-02.lnd
world\wdMadrigal\WdMadrigal04-03.lnd
world\wdMadrigal\WdMadrigal04-04.lnd
Bisher habe ich keine Lösung dafür finden können. Hoffe jemand weiß weiter.
09/14/2013 22:42 tolio#2
[Only registered and activated users can see links. Click Here To Register...]
+
for schleife
09/15/2013 00:14 Sedrika#3
Das passt leider nicht zu dem was ich so suche.
Der Index muss mit einer null beginnen, allerdings habe ich eine zwei am Anfang, diese stellt das da, was die "D2" in dem fall machen würde. Nur die Auflistung für 00,04 fehlt noch.
09/15/2013 00:32 tolio#4
€dit: so grad auch im vs getestet, klappt:
Code:
        Const outer As Integer = 4
        Const inner As Integer = 4
        Const fmt As String = "00"

        For i = 0 To outer
            For a = 0 To inner
                TextBox1.Text &= i.ToString(fmt) & "-" & a.ToString(fmt) & vbCrLf
            Next a
            TextBox1.Text &= vbCrLf
        Next i
output:
Code:
00-00
00-01
00-02
00-03
00-04

01-00
01-01
01-02
01-03
01-04

02-00
02-01
02-02
02-03
02-04

03-00
03-01
03-02
03-03
03-04

04-00
04-01
04-02
04-03
04-04
09/15/2013 00:43 Sedrika#5
Ne, das passt nicht. Kommt 16x "04-04" bei raus. Ansatz ist okay aber noch nicht das was ich will. Die Aufzählung kann ich ja schon korrekt darstellen. Ich will das ganze aber direkt so haben, dass ich aus dem Wert eine Art Pattern habe um einen Ordner nach Dateien die diesem Muster passen anzeigen zu lassen.
09/15/2013 00:45 tolio#6
war nen schreibfehler drin, schau edit

sonst musste es mit regex machen wenn du nur danach suchen willst
09/15/2013 08:02 'Heaven.#7
Loope dich doch durch alle Dateien und schau ob dein regex pattern passt...
09/15/2013 10:16 Sedrika#8
Sind knapp 1200 Dateien. Ich will nicht jedes mal alle durchgehen.
09/15/2013 11:15 qkuh#9
1200 Dateien sind nichts.
09/15/2013 11:27 Sedrika#10
Es geht nicht um das durchsuchen der einzelnen dateien auf die Pattern sondern um so wenig Perfomance verlust wie möglich.
09/15/2013 11:55 dready#11
Du wirst dir alle Dateien ansehn müssen, wie willst du sonst wissen das sie nicht ins Pattern passen oder Bereits erfasst wurden ?
09/15/2013 12:46 tolio#12
hinzu kommt das 1200 pfade vergleichen für nen pc kein problem ist, du musst ja nicht alle inhalte auslesen oder sonst was
09/15/2013 12:58 Sedrika#13
Um das auszählen kam ich leider nicht rum. Da muss ich dann etwas Performance einstecken lassen, auch wenn es nur ein wenig ist.

Folgendes habe ich "fabriziert"
Code:
String count = Scanner.GetToken();
count = count.Replace("(", "{").Replace(")", "}");
Regex regex = new Regex("{(.*)}");
var v = regex.Match(count);
string[] temp = v.Groups[0].ToString().Split('-');
string[] result1 = temp[1].Replace("{", "").Replace("}", "").Split(',');
string[] result2 = temp[0].Replace("{", "").Replace("}", "").Split(',');
string[] s1 = Path.GetDirectoryName(count).Split('\\');
s1[0] = s1[s1.Length - 1];

String[] nFiles = Directory.GetFiles(Path.GetDirectoryName(count), "*.*", SearchOption.TopDirectoryOnly);

szFiles = new ArrayList();

for (int j = Convert.ToInt32(result1[1]); j <= Convert.ToInt32(result1[2]); ++j)
{
	for (int e = Convert.ToInt32(result2[1]); e <= Convert.ToInt32(result2[2]); ++e)
	{
		String sFile = String.Format(Path.GetDirectoryName(count) + "\\" + s1[0] + "{0:D" + result1[0] + "}-{1:D" + result2[0] + "}" + Path.GetExtension(count), j, e);
		for (int i = 0; i < nFiles.Length; ++i)
		{
			if (sFile.ToLower() == nFiles[i].ToLower())
			{
				szFiles.Add(sFile.ToLower());
			}
		}
	}
}
Es funktioniert auch perfekt, falls ihr da noch verbesserungen sehen könnt, gebt mir bitte bescheid.
"Scanner.GetToken()" liest "world\wdMadrigal\WdMadrigal(2,00,04)-(2,00,04).lnd" aus.
09/15/2013 13:13 dready#14
Verbesserungen in welche Richtung ?

Du könntest nen paar Sachen weglassen, wobei du Perfomancen gegen Sauberkeit und Lesbarkeit tauschst, aber um ehrlich zu sein seh ich kein wirklichen Grund dafür, sobald DAS der Grund für ein Perfomancenflaschenhals wird, solltest du so oder so auf ne native Sprache umsteigen und möglichst viele kritische Stellen direkt mit ASM lösen. (Und beten das der eigenen Code tatsächlich schneller ist als der den die hervoragenden MS Compiler ausspucken :D )
09/15/2013 13:28 Sedrika#15
Naja, dann lasse ich das ganze mal so.
Danke an die, die versucht haben zu helfen.