C# Vergleich

PhilippVP

Cadet 2nd Year
Dabei seit
Juni 2013
Beiträge
24
Hallo Leute,

ich brauche mal eure Hilfe.

Und zwar habe ich das Problem das bei meinem bisherigen Vergleich der Inhalt einer Datei mit dem Inhalt eines Ordners verglichen wird.
Was schon richtig ist, aber man geht ja nicht her und vergleicht die Datei mit dem Ordner sondern man nimmt ja die Dateien/Bilder aus dem Ordner und vergleicht diese mit einer/der externen Datei, dass ist ja von der Suche her viel schneller und effektiver.

Hier mein bisheriger Code:
Code:
            System.IO.DirectoryInfo dInfo;
            System.IO.FileInfo fInfo;
            System.IO.StreamReader sReader;
            System.IO.StreamWriter swVergleichProtocolausgeben;
            List<string> lstFiles;

            try
            {
                if (txtOrdnerPfad.Text.Length > 0 && txtOrdnerPfad.Text != _TxtFolderTextAtStartup && txtTextdateiPfad.Text.Length > 0 && txtTextdateiPfad.Text != _TxtTextFileAtStartup)
                {
                    dInfo = new System.IO.DirectoryInfo(txtOrdnerPfad.Text);
                    if (!dInfo.Exists)
                        throw new NullReferenceException("Ordner existiert nicht oder ist schreibgeschützt");

                    fInfo = new System.IO.FileInfo(txtTextdateiPfad.Text);
                    if (!fInfo.Exists)
                        throw new NullReferenceException("Datei existiert nicht oder ist durch die Benutzung eines anderen Benutzer schreibgeschützt");

                    fInfo = null;
                    sReader = new System.IO.StreamReader(txtTextdateiPfad.Text);
                    lstFiles = new List<string>();
                    do
                    {
                        lstFiles.Add(sReader.ReadLine());
                    }
                    while (!sReader.EndOfStream);

                    foreach (string strFileName in lstFiles)
                    {
                        txtProtocol.Text += DateTime.Now + " Bildbezeichnung ---> " + strFileName + ".jpg" + " Existiert ---> ";
                        txtProtocol.Text += (from dFiles in dInfo.GetFiles() where dFiles.Name == strFileName + ".jpg" select dFiles).Count() > 0;
                        txtProtocol.Text += Environment.NewLine;
}

Jetzt ist meine Frage wie kann ich den Vergleich umdrehen das er erst die Bilder im Ordner nimmt und diese mit der Datei vergleicht?

Bin für jede Hilfe sehr dankbar.

Mit freundlichen Grüßen
Philipp
 

DocWindows

Rear Admiral
Dabei seit
Mai 2013
Beiträge
5.360
Du erstellst dir über System.IO.Directory.GetFiles() eine Liste der Dateien und gehst die mit foreach durch.

Du kannst dir das do {} übrigens sparen wenn du die Funktion System.IO.File.ReadAllLines nutzt.
Außerdem würde ich bei Dateinamenvergleichen die Namen für einen Vergleich über die Funktionen ToLower() oder ToUpper() des String-Objekts in Kleinbuchstaben oder Großbuchstaben umwandeln. Nur für den Fall dass die Groß-/Kleinschreibung in der Textdatei und dem Verzeichnis anders ist.
 

BlooDFreeZe

Lt. Commander
Dabei seit
Juli 2006
Beiträge
1.160
Noch zwei Anmerkungen: 1. NullReferenceException ist für den Fall nicht gedacht. 2. Keine Ahnung ob du es unter dem Code gemacht hast aber denk auf jeden Fall daran die ganzen Streams wieder zu schließen.
 

PhilippVP

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Juni 2013
Beiträge
24
@DocWindows:
und wie kann ich diese Liste von System.IO.Directory.GetFiles() mit dem anderes String der Datei vergleichen?

Nein die Groß-/Kleinschreibung muss identisch sein.



@BlooDFreeZe:
1. Danke für deinen Hinweis
2. Ja das kommt weiter unten dann weil vorher kommt noch ein Move Befehl den ich nicht mit kopiert habe.
 

PapstRatze

Lt. Junior Grade
Dabei seit
Aug. 2008
Beiträge
436
Bei der Abfrage des Pfades musste ich etwas schmunzeln, eleganter wäre hier die Abfrage auf string.IsNullOrEmpty(...), sieht irgendwie einfach besser aus.
Code:
if (!string.IsNullOrEmpty(txtOrdnerPfad.Text) && !string.IsNullOrEmpty(txtTextdateiPfad.Text) && txtOrdnerPfad.Text != _TxtFolderTextAtStartup  && txtTextdateiPfad.Text != _TxtTextFileAtStartup) { ... }
Wenn du den StreamReader weiter verwenden möchtest, kannst du nun hingehen und die textDatei als "eine" Zeichenkette auslesen. Das sollte aber mit Vorsicht zu genießen sein, die Datei darf natürlich nicht zu groß sein. Dann kannst du schauen ob diese den Namen einer Datei im Ordner enthält. Zum Beispiel mit einer foreach-Schleife
Code:
foreach(var item in dinfo.GetFiles())
{
    if(text.Contains(item.Name)) //nur die Namen keine Pfade?
    { /* do something */ }
}
Wenn du in jeder Zeile einen Datei-Pfad hast, kann du das natürlich genauso auslesen wie du es im Moment machst. Gehst dann jede Datei durch und schaust ob diese in der List<string> drinnen ist.
 
Zuletzt bearbeitet:

PhilippVP

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Juni 2013
Beiträge
24
@PapstRatze:
Danke für den Hinweis beim ersten das habe ich jetzt auch geändert. :)

Kannst du mir aber das zweite noch einmal etwas genauer erklären, da stehe ich etwas auf dem Schlauch?
 

PapstRatze

Lt. Junior Grade
Dabei seit
Aug. 2008
Beiträge
436
Okay, beim zweiten holst du dir über "DirectoryInfo.GetFiles();" ein Array von FileInfos. D.h. dieses "FileInfo[]" gehst du mit einer foreach-Schleife durch. Item ist in jedem Durchgang also eine FileInfo, je nachdem was du nun genau vergleichen willst, checkst du ob dein List<string> diese Zeichenkette enthält (oder eben dein string).

Man könnte es vom Ablauf dann so darstellen:
DirectoryInfo.GetFiles(); => Gehe alle Files durch => Checke ob der Name der File in der Liste ist => wenn ja: Mache etwas => nächste Datei ... usw.

#Edit: Wenn man es anders herum macht, kann man natürlich von der Überladung von GetFiles() profitieren und nach einer speziellen Datei suchen. Die Frage ist aber, was du damit überhaupt machen möchtest. Brauchst du die FileInfo oder soll nur gecheckt werden, ob eine Datei im Ordner so heißt. Für letzteres würde es dann auch bessere Möglichkeiten geben.
 
Zuletzt bearbeitet:
Top