Benutzer mit den meisten Antworten
FileFInder

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
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 -
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
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 -
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
-
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
-
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