C# Dateiname auslesen

TresPuntos

Cadet 4th Year
Registriert
Juni 2018
Beiträge
113
Hallo Leute,

die Anforderung ist es alle Dateien aus dem Pfad C:\Beispiel\Test zu lesen. Wenn der Dateiname in meiner ListBox enthalten ist, muss die Datei in das Verzeichnis C:Beispiel\Hilfsdatei\ListboxName\ (sieht meistens so aus: ListboxName_functions.txt) . Wenn der Name nicht in der Listbox enthalten ist, muss diese in C:\Beispiel\Unbrauchbar\ (heißt dann beispielsweise so: functions.txt ). Sprich wenn der Name enthalten ist, muss die Datei auch in sein entsprechendes Verzeichnis rein. Die Datei mit functions.txt muss in das Verzeichnis der Rest eigentlich unter die jeweiligen Namen. Mit dem If habe ich bereits die functions.txt abgefangen, aber ich weiß nicht wie ich das mit dem ListboxItemNamen und dem jeweiligen Verzeichnis mache, habe jetzt mal provisorisch ein if und foreach eingefügt. Habe beim 2. If-Else ein return eingefügt, falls es noch eine unvorhergesehene Datei gibt.


Code:
        private void CopyDirectoryMitIfAbfrage()
        {
            //in der Textbox soll der auszulesende Pfad eingegeben werden (mit einer eigenen Methode die den Pfad mit einem \ beendet)
            string sourcePath = PfadRichtigAusgeben(TxtPfadAuslesen.Text);
            // diese Klasse wird zum Auslesen des Verzeichnisinhaltes benötigt
            DirectoryInfo ds = new DirectoryInfo(sourcePath);
            try
            {
                //Rekursiver Aufruf vom "Suchordner"
                foreach (DirectoryInfo d in ds.GetDirectories())
                {
                    //Wenn in Listbox existiert, hier weiß ich nicht weiter, ein Foreach müsste hier doch auch sein?
                    if (d.Name == "functions.txt" )
                    {
                        //dann nimmt er den ListboxName und fügt es in seinen Pfad
                        String targetPath = @"C:\Beispiel\Unbrauchbar\";
                        DirectoryInfo kds = new DirectoryInfo(targetPath); // diese Klasse wird zum Auslesen des Verzeichnisinhaltes benötigt

                        // Zielverzeichnis anlegen falls noch nicht vorhanden
                        if (!Directory.Exists(targetPath))
                            Directory.CreateDirectory(targetPath);

                        // Rekursiv CoypDirectory() mit allen Unterverzeichnissen aufrufen,
                        // auch im Zielordner die Verzeichnisstruktur beibehalten.
                        foreach (DirectoryInfo k in ds.GetDirectories())
                        {
                            CopyDirectory(d.FullName, targetPath + "\\" + d.Name);
                        }

                        // Alle Dateien in ds durchlaufen, GetFiles() liefert jedoch kein File - Objekt sondern ein FileInfo - Objekt zurück.
                        // Dieses besitzt aber ähnliche Eigenschaften, MoveTo() und CopyTo() sind z.B. auch vorhanden.
                        foreach (FileInfo f in ds.GetFiles())
                        {
                            f.CopyTo(targetPath + "\\" + f.Name, true);
                        }
                    }
                    // habe mal ein foreach drinnen und ifelse weiß aber nicht wie sie zu nutzen sind
                    else
                    {
                        foreach ()
                        {
                            if ()
                            {
                                //dann nimmt er den ListboxName und fügt es in seinen Pfad
                                String targetPath = @"C:\Beispiel\Hilfsdatei\" + ListBoxName.SelectedItems;
                                DirectoryInfo kds = new DirectoryInfo(targetPath); // diese Klasse wird zum Auslesen des Verzeichnisinhaltes benötigt

                                // Zielverzeichnis anlegen falls noch nicht vorhanden
                                if (!Directory.Exists(targetPath))
                                    Directory.CreateDirectory(targetPath);

                                // Rekursiv CoypDirectory() mit allen Unterverzeichnissen aufrufen,
                                // auch im Zielordner die Verzeichnisstruktur beibehalten.
                                foreach (DirectoryInfo k in ds.GetDirectories())
                                {
                                    CopyDirectory(d.FullName, targetPath + "\\" + d.Name);
                                }

                                // Alle Dateien in ds durchlaufen, GetFiles() liefert jedoch kein File - Objekt sondern ein FileInfo - Objekt zurück.
                                // Dieses besitzt aber ähnliche Eigenschaften, MoveTo() und CopyTo() sind z.B. auch vorhanden.
                                foreach (FileInfo f in ds.GetFiles())
                                {
                                    f.CopyTo(targetPath + "\\" + f.Name, true);
                                }
                            }
                            else { return}
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
 
@xenon-seven hat geklappt, musste noch ein bisschen forschen aber es klappt.
Habe aber ein Problem bekomme eine Fehlermeldung, dass beim rüberkopieren die Fehlermeldung kommt:
Die Datei kann nicht verschoben werden, weil sie irgendwo anders offen ist.
Allerdings habe ich die Datei nicht geöffnet und es ist auch eine gerade erstellte txt datei.

C#:
if (Path.GetFileName(itemPath) == "functions.txt")
                {
                    string targetPath = PfadRichtigAusgeben(txtPfadEinfügen.Text) + @"resources\data\functions\";
                    string sourceFile = System.IO.Path.Combine(sourcePath, itemPath);
                    string destFile = System.IO.Path.Combine(targetPath, itemPath);
                    String directoryName = Path.GetDirectoryName(destFile);
                    if (!System.IO.Directory.Exists(directoryName))
                    {
                        DirectoryInfo di = Directory.CreateDirectory(directoryName);
                    }
                    System.IO.File.Copy(sourceFile, destFile, true);
                    if (System.IO.Directory.Exists(sourcePath))
                    {
                        destFile = System.IO.Path.Combine(targetPath, itemPath);
                        System.IO.File.Copy(sourceFile, destFile, true);
                    }
                    else
                    {
                        Console.WriteLine("Source path does not exist!");
                    }
                }
                else
                {
                    MessageBox.Show("wieder falsch: " + Path.GetFileName(itemPath));
                }
 
Was sagt die Exception genau? Bitte auf innere Exceptions achten.

greetz
hroessler
 
@hroessler
1528894943466.png

Also ich denke, dass in der schleife schon darauf zugegriffen wird, aber ich weiß nicht wie ich es anders coden sollte.
Es soll nämlich abgefragt werden, welche Dateien es im Verzeichnis (C:\Bsp\resources\data\functions\) gibt.
Danach soll geschaut werden, ob diese Datei den Namen functions.txt hat.
Anschließend soll diese Datei mit dem Namen functions.txt in ein Verzeichnis (C:\...\resources\data\functions\) rüberkopiert werden.
Später soll im else-Zweig noch eine weitere Funktion kommen, falls diese Datei nicht functions.txt heißt.


C#:
private void CopyDirectoryMitIfAbfrage()
        {
            string sourcePath = PfadRichtigAusgeben(TxtPfadAuslesen.Text) + @"resources\data\functions\";
            String[] dateiliste = Directory.GetFiles(sourcePath);

            foreach(string itemPath in dateiliste)
            {
                if (Path.GetFileName(itemPath) == "functions.txt")
                {
                    string targetPath = PfadRichtigAusgeben(txtPfadEinfügen.Text) + @"resources\data\functions\";
                    string sourceFile = System.IO.Path.Combine(sourcePath, itemPath);
                    string destFile = System.IO.Path.Combine(targetPath, itemPath);
                    String directoryName = Path.GetDirectoryName(destFile);
                    if (!System.IO.Directory.Exists(directoryName))
                    {
                        DirectoryInfo di = Directory.CreateDirectory(directoryName);
                    }
                    System.IO.File.Copy(sourceFile, destFile, true);
                    if (System.IO.Directory.Exists(sourcePath))
                    {
                        destFile = System.IO.Path.Combine(targetPath, itemPath);
                        System.IO.File.Copy(sourceFile, destFile, true);
                    }
                    else
                    {
                        Console.WriteLine("Source path does not exist!");
                    }
                }
                else
                {
                    MessageBox.Show("wieder falsch: " + Path.GetFileName(itemPath));
                }
            }
        }
 
Hier mal der relevante Teil aus der Path.Combine() Doku:
Wenn path2 einen absoluten Pfad enthält, gibt diese Methode path2 zurück.
Dann gehst du mal in den Debugger und guckst, was ab Zeile 11 passiert.

Ich verstehe auch nicht, warum du noch mit PfadRichtigAusgeben() arbeitest, wenn du doch Path.Combine() kennst?
 
Könnte es daran liegen, dass du 2 mal kopierst? Wenn der erste Aufruf noch kopiert legt sich der zweite natürlich mit der Meldung auf die Nase.

greetz
hroessler
 
Er kopiert die Datei auf sich selbst. Das kann natürlich nicht funktionieren.
 

Ähnliche Themen

Zurück
Oben