none
FileFInder RRS feed

  • Frage

  • Hallo zusammen

    Ich habe den Auftrag bekommen einen FileFinder in C# zu entwickeln, der folgendes kann:

    • Eingabe des Start-Verzeichnisses ist möglich.
    • Es gibt eine kritische Länge, die definiert werden kann. (es werden nur die Files ausgegeben die diese mit dem Gesamtpfad überschreiten)
    • Alle Files werden mit Filename, Länge des Filnamens, Pfad, Pfadlänge, Gesamtpfad(Filename + Pfad) und Länge des Gesamtpfades.
    • Die Tabelle (DataGridView) kann ins Excel exportiert werden.

    Das Problem ist, ich habe keine Ahnung von C#. :(

    Ich habe nun einfach mit dem Auslesen der Files begonnen.. allerdings hat es mehrere Möglichkeiten nur leider bringe ich keine zum funktionieren und an dieser Stelle bitte ich euch um Hilfe.

    Meine gescheiterten Versuche:

            private void cmdLos_Click(object sender, EventArgs e)
            {
                String Pfad = txtPfad.Text;
    
                //1. Versuch
                if (txtPfad.Text != "")
                {
                    System.IO.DirectoryInfo Verzeichnis = new System.IO.DirectoryInfo(Pfad);
                    foreach (System.IO.DirectoryInfo Directory in Verzeichnis.GetDirectories())
                    {
                        MessageBox.Show("Ordnername: " + Directory.Name + Environment.NewLine + "Pfad: " + Directory.FullName);
                    }
                    foreach (System.IO.FileInfo File in Verzeichnis.GetFiles())
                    {
                        MessageBox.Show("Dateiname: " + File.Name + Environment.NewLine + "Länge: " + File.Name.Length);
                    }
                }
                else
                {
                    MessageBox.Show("Bitte geben Sie einen Pfad ein.");
                    txtPfad.Focus();
                }
    
                //2. Versuch
                string[] filePaths = Directory.GetFiles(Pfad, "*", SearchOption.AllDirectories);
                string[] fileNames = filePaths.Split  
                foreach (var item in filePaths)
                {
                    MessageBox.Show(item);
                }
            }

    Beim 1. Versuch gibt er mir nur die Files im ersten Verzeichnis aus.. aber ich brauche auch die aus den Unterverzechnisse.

    Beim 2. Versuch habe ich versucht alle Files aufzmal auszulesen und dann den Filenamen am Ende nach dem \ abzutrennen, doch dies wird viel mehr Arbeit brauchen da ich wie oben erwähnt; Filename, Länge des Filenamens, Pfad, Länge des Pfads, GesamtPfad, Länge des Gesamtpfads brauche.

    Ich hoffe Ihr könnt mir hier weiterhelfen.

    Freundliche Grüsse

    neRf420

    Dienstag, 7. Juli 2015 10:00

Antworten

  • Hallo neRf420,

    zuersteinmal willkommen Im Forum!

    Du erwartest doch wohl hoffentlich nicht, dass du jetzt eine komplettlösung bekommen wirst?

    Aber einige Hinweise kann ich dir geben:

    • Um Ornder mitsammt der Unterordner zu durchsuchen, kannst du einen rekursiven Aufruf verwenden. Schau mal hier, da siehst du, wie so etwas rekusiv laufen kann. Statt die Dateigröße zu lessen, kannst du aber eher die Dateiinformationen wie "Name", "Pfad" etc. lessen.
    • Du kannst die Ergebnisse der rekursiven Suche in einer Liste speichern (am besten für jeden Eintrag ein Element erzeugen, also quasi:
    List<MyFileInfo> files = new List<MyFileInfo>();
    
    // MyFileInfo ist als Klasse zu definieren:
    class MyFileInfo {
        public string Name { get; set; }
        public string Path { get; set; }
    }
    
    // ERstellen kannst du es wie folgt.
    // Angenommen, f sei deine FileInfo-Instanz:
    var d = new MyFileInfo() {
        Name = f.Name,
        Path = f.Filename // oder wie es auch heißt...?
    }
    
    // zur liste hinzufügen
    files.Add(d); 

    Bei weiteren Fragen bitte einfach melden!

    © 2015 Thomas Roskop
    Germany //  Deutschland

    • Als Antwort markiert neRf420 Dienstag, 7. Juli 2015 11:48
    • Tag als Antwort aufgehoben neRf420 Dienstag, 7. Juli 2015 11:48
    • Als Antwort markiert neRf420 Dienstag, 7. Juli 2015 11:50
    Dienstag, 7. Juli 2015 10:14
  • Hallo,

    hier habe ich mal ein umfangreicheres Beispiel:

    //
        // Ermöglicht erstellen einer Liste aller Dateien die in einem 
        // Order vorkommen. Auch unterordner werden beachet.
        // Achtung:
        //  1) Dieser Code läuft synchron, dass heißt, dass die UI (das Fenster) je nach größe des Ordners
        //     bis zu mehrere Sekunden blockiert werden könnte (keine Reaktion).
        //  2) Sollte innerhalb des Ordner eine Datei oder ein Ordner nicht geöffnet werfden können,
        //     weil die Rechte fehlen, bricht di Funktion ab und wirft eine passende Exception.
        //     Diese sollte aufgefangen werden, weil sonst die Anwendung abstürzt.
        //
        public static class FileFinder
        {
            public static List<FileFinderResult> FindFilesForDirectory(string path)
            {
                return FindFilesForDirectory(new DirectoryInfo(path));
            }
    
            public static List<FileFinderResult> FindFilesForDirectory(DirectoryInfo dir)
            {
                List<FileFinderResult> r = new List<FileFinderResult>();
                __InternalSearch(dir, r);
                return r;
            }
    
            // Ruft sich rekusriv auf
            private static void __InternalSearch(DirectoryInfo info, List<FileFinderResult> list)
            {
                foreach (var item in info.GetFiles())
                {
                    list.Add(new FileFinderResult(item));
                }
    
                foreach (var item in info.GetDirectories())
                {
                    __InternalSearch(item, list);
                }
            }
    
            //
            // Füllt die Datentabelle mit den Ergebnissen.
            // Diese Tabelle entspricht der Anzeige, wie sie auch Excel verstehen kann, weshalb das kopieren 
            // und Einfügen klappen sollte.
            // die bei der Dateisuche gefunden wurden.
            //
            public static void FillTable(DataGridView view, List<FileFinderResult> results)
            {
                DataTable table = new DataTable(); // Neue Tabelle erstellen
                DataColumn column;
                DataRow row;
                DataSet dataSet;
    
                // ID (muss sein)
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "ID";
                column.Caption = "ID";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Dateiname
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "Name";
                column.Caption = "Dateiname";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Dateinameslänge
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "NameSize";
                column.Caption = "Länge des Dateinamens";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Die anderen Spalten kannst du selber einfügen, also die Path und PathLength...
    
                // ID als Standartschlüssel eintragen
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = table.Columns["id"];
                table.PrimaryKey = PrimaryKeyColumns;
    
                dataSet = new DataSet();
                dataSet.Tables.Add(table);
    
                //
                // Kinder in die Tabelle einfügen
                //
                int i = 0; // Zähler
                foreach (var item in results)
                {
                    row = table.NewRow(); // Neue Zeile erstellen
                    row["ID"] = i;
                    row["Name"] = item.Name;
                    row["NameSize"] = item.NameLength;
                    // ... Für Pfad auch machen
                    i++;
                }
    
                var bindingSource1 = new BindingSource();
                bindingSource1.DataSource = dataSet;
                view.DataSource = bindingSource1;
            }
        }
    
        public sealed class FileFinderResult
        {
            private FileInfo m_fileinfo;
            public FileFinderResult(FileInfo info)
            {
                m_fileinfo = info;
            }
    
            public string Name { get { return m_fileinfo.Name; } }
            public string Path { get { return m_fileinfo.FullName; } }
            public int NameLength { get { return Name.Length; } }
            public int PathLength { get { return Path.Length; } }
            // ... weitere Egienschaften kannst du selber erstellen ;)
        }

    Hoffe, es hilft.

    PS: Wenn die das geholfen hat, markiere es doch "als Antwort" (link unten drunter).


    © 2015 Thomas Roskop
    Germany //  Deutschland


    • Bearbeitet Thomas Roskop Dienstag, 7. Juli 2015 11:57
    • Als Antwort markiert neRf420 Mittwoch, 8. Juli 2015 07:38
    Dienstag, 7. Juli 2015 11:51

Alle Antworten

  • Hallo neRf420,

    zuersteinmal willkommen Im Forum!

    Du erwartest doch wohl hoffentlich nicht, dass du jetzt eine komplettlösung bekommen wirst?

    Aber einige Hinweise kann ich dir geben:

    • Um Ornder mitsammt der Unterordner zu durchsuchen, kannst du einen rekursiven Aufruf verwenden. Schau mal hier, da siehst du, wie so etwas rekusiv laufen kann. Statt die Dateigröße zu lessen, kannst du aber eher die Dateiinformationen wie "Name", "Pfad" etc. lessen.
    • Du kannst die Ergebnisse der rekursiven Suche in einer Liste speichern (am besten für jeden Eintrag ein Element erzeugen, also quasi:
    List<MyFileInfo> files = new List<MyFileInfo>();
    
    // MyFileInfo ist als Klasse zu definieren:
    class MyFileInfo {
        public string Name { get; set; }
        public string Path { get; set; }
    }
    
    // ERstellen kannst du es wie folgt.
    // Angenommen, f sei deine FileInfo-Instanz:
    var d = new MyFileInfo() {
        Name = f.Name,
        Path = f.Filename // oder wie es auch heißt...?
    }
    
    // zur liste hinzufügen
    files.Add(d); 

    Bei weiteren Fragen bitte einfach melden!

    © 2015 Thomas Roskop
    Germany //  Deutschland

    • Als Antwort markiert neRf420 Dienstag, 7. Juli 2015 11:48
    • Tag als Antwort aufgehoben neRf420 Dienstag, 7. Juli 2015 11:48
    • Als Antwort markiert neRf420 Dienstag, 7. Juli 2015 11:50
    Dienstag, 7. Juli 2015 10:14
  • Guten Tag,

    Ich Danke dir für die schnelle Antwort.

    Nein eine Komplettlösung suche ich sicherlich nicht.

    Du musst beachten dass ich überhaupt keine Ahnung habe und das Ganze mithilfe von Google ausprobiere. Somit verstehe ich auch deine Antwort nicht ganz. Könntest du es mir anhand meines Beispiels, Variante 1 oder Variante 2, zeigen?

    Danke und Gruss

    neRf420

    Dienstag, 7. Juli 2015 10:54
  • Hallo,

    hier habe ich mal ein umfangreicheres Beispiel:

    //
        // Ermöglicht erstellen einer Liste aller Dateien die in einem 
        // Order vorkommen. Auch unterordner werden beachet.
        // Achtung:
        //  1) Dieser Code läuft synchron, dass heißt, dass die UI (das Fenster) je nach größe des Ordners
        //     bis zu mehrere Sekunden blockiert werden könnte (keine Reaktion).
        //  2) Sollte innerhalb des Ordner eine Datei oder ein Ordner nicht geöffnet werfden können,
        //     weil die Rechte fehlen, bricht di Funktion ab und wirft eine passende Exception.
        //     Diese sollte aufgefangen werden, weil sonst die Anwendung abstürzt.
        //
        public static class FileFinder
        {
            public static List<FileFinderResult> FindFilesForDirectory(string path)
            {
                return FindFilesForDirectory(new DirectoryInfo(path));
            }
    
            public static List<FileFinderResult> FindFilesForDirectory(DirectoryInfo dir)
            {
                List<FileFinderResult> r = new List<FileFinderResult>();
                __InternalSearch(dir, r);
                return r;
            }
    
            // Ruft sich rekusriv auf
            private static void __InternalSearch(DirectoryInfo info, List<FileFinderResult> list)
            {
                foreach (var item in info.GetFiles())
                {
                    list.Add(new FileFinderResult(item));
                }
    
                foreach (var item in info.GetDirectories())
                {
                    __InternalSearch(item, list);
                }
            }
    
            //
            // Füllt die Datentabelle mit den Ergebnissen.
            // Diese Tabelle entspricht der Anzeige, wie sie auch Excel verstehen kann, weshalb das kopieren 
            // und Einfügen klappen sollte.
            // die bei der Dateisuche gefunden wurden.
            //
            public static void FillTable(DataGridView view, List<FileFinderResult> results)
            {
                DataTable table = new DataTable(); // Neue Tabelle erstellen
                DataColumn column;
                DataRow row;
                DataSet dataSet;
    
                // ID (muss sein)
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "ID";
                column.Caption = "ID";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Dateiname
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.String");
                column.ColumnName = "Name";
                column.Caption = "Dateiname";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Dateinameslänge
                column = new DataColumn();
                column.DataType = System.Type.GetType("System.Int32");
                column.ColumnName = "NameSize";
                column.Caption = "Länge des Dateinamens";
                column.ReadOnly = true;
                column.Unique = true;
                // Add the Column to the DataColumnCollection.
                table.Columns.Add(column);
    
                // Die anderen Spalten kannst du selber einfügen, also die Path und PathLength...
    
                // ID als Standartschlüssel eintragen
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = table.Columns["id"];
                table.PrimaryKey = PrimaryKeyColumns;
    
                dataSet = new DataSet();
                dataSet.Tables.Add(table);
    
                //
                // Kinder in die Tabelle einfügen
                //
                int i = 0; // Zähler
                foreach (var item in results)
                {
                    row = table.NewRow(); // Neue Zeile erstellen
                    row["ID"] = i;
                    row["Name"] = item.Name;
                    row["NameSize"] = item.NameLength;
                    // ... Für Pfad auch machen
                    i++;
                }
    
                var bindingSource1 = new BindingSource();
                bindingSource1.DataSource = dataSet;
                view.DataSource = bindingSource1;
            }
        }
    
        public sealed class FileFinderResult
        {
            private FileInfo m_fileinfo;
            public FileFinderResult(FileInfo info)
            {
                m_fileinfo = info;
            }
    
            public string Name { get { return m_fileinfo.Name; } }
            public string Path { get { return m_fileinfo.FullName; } }
            public int NameLength { get { return Name.Length; } }
            public int PathLength { get { return Path.Length; } }
            // ... weitere Egienschaften kannst du selber erstellen ;)
        }

    Hoffe, es hilft.

    PS: Wenn die das geholfen hat, markiere es doch "als Antwort" (link unten drunter).


    © 2015 Thomas Roskop
    Germany //  Deutschland


    • Bearbeitet Thomas Roskop Dienstag, 7. Juli 2015 11:57
    • Als Antwort markiert neRf420 Mittwoch, 8. Juli 2015 07:38
    Dienstag, 7. Juli 2015 11:51
  • Hi,

    Das mit dem File Auslesen habe ich so gelöst:

            public static void TraverseFileSystem(String strDir)
            {
                try
                {
                    // 1. Für alle Dateien im aktuellen Verzeichnis
                    foreach (String strFile in Directory.GetFiles(strDir))
                    {
                        // Aktion
                        MessageBox.Show(strFile);
                    }
    
                    // 2. Für alle Unterverzeichnisse im aktuellen Verzeichnis
                    foreach (String strSubDir in Directory.GetDirectories(strDir))
                    {
                        // 2a. Aktion
                        MessageBox.Show(strSubDir);
    
                        // 2b. Rekursiver Abstieg
                        TraverseFileSystem(strSubDir);
                    }
                }
                catch (Exception)
                {
                    // 3. Statt Console.WriteLine hier die gewünschte Aktion
                    MessageBox.Show("error: " + strDir);
                }
            }

    Das mit dem Auflisten der Daten werde ich anhand deines Beispiels probieren. Ich denke aber dass das grösste Hindernis überwunden wurde. Danke an dieser Stelle.

    Gruss

    Mittwoch, 8. Juli 2015 07:40