none
Dateinamen aus einem Ordner auslesen und in eine Textdatei schreiben. RRS feed

  • Frage

  • Ich habe ein Programm das Dateien aus einem wählbaren Quellordner in einen wählbaren Zielordner kopiert.

    Nach dem kopieren wird eine Log Datei mit dem Namen des aktuellen Datums erstellt.

    In diese .txt Datei möchte ich die Namen aller Kopierten Dateien untereinander schreiben.

    Montag, 29. Juli 2019 07:14

Antworten

Alle Antworten

  • Idealerweise machst du das doch glich dort, wo du auch die Dateien kopierst. Ansonsten: Hole dir die Dateiliste und schreibe jede Datei einzeln in eine Textdatei:

                using (var logfile = new StreamWriter($@"C:\Temp\{DateTime.Now.ToShortDateString()}.txt"))
                {
                    logfile.WriteLine($"Source Dir: {source}");
                    foreach (var fi in new DirectoryInfo(source).GetFiles())
                    {
                        logfile.WriteLine($"{fi.Name}");
                    }
                }


    Montag, 29. Juli 2019 07:53
  • Soll ich diesen code bei button_click einfügen?

    Bzw. ist es hier erlaubt den ganzen code einzufügen?

    Montag, 29. Juli 2019 08:00
  • Code, der hier geschrieben wird, kannst du normalerweise übernehemen. Aber du musst natürlich Anpassungen vornehmen, damit das dann auch auf deine Anforderungen passt. Ich weiss nicht, was sonst bei deinem Programm im Button_Click() passiert...

    Ich habe z.B. die Logdatei fix auf C:\Temp\ gesetzt; das kann bei dir anders sein. Ebenso wie der Dateiname selbst.

    Zum anderen weiss ich nicht, in welcher variable bei dir das Quellverzeichnis hinterlegt ist; ich habe es der Einfachheit halber mal source genannt.

    Und wir ich schon oben geschrieben habe: Wenn du ohnehin die Dateien im Verzeichnis einzeln (in einer Schleife) kopierst, kannst du auch an dieser Stelle das Scheiben der Logdatei hinzufügen.


    Montag, 29. Juli 2019 08:46
  • Hier ist mein Bisheriger code.

    Es wird bereits eine log Datei erstellt.

    Die vorgeschlagene lösung hat nicht funktioniert :/

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Globalization;
    using System.Diagnostics;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace WindowsFormsControlLibrary1
    {

        public partial class UserControl1: UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }

            private void BtnVerzeichnis_Click(object sender, EventArgs e)
            {
                DialogResult result = folderBrowserDialog1.ShowDialog();
                if(result == DialogResult.OK)
                {
                    txtQuelle.Text = folderBrowserDialog1.SelectedPath;
                }
            }

            private void BtnZiel_Click(object sender, EventArgs e)
            {
                DialogResult result = folderBrowserDialog1.ShowDialog();
                if (result == DialogResult.OK)
                {
                    txtZiel.Text = folderBrowserDialog1.SelectedPath;
                }
            }

            private void BtnStart_Click(object sender, EventArgs e)
            {
                if (btnStart != null)  //Noch nicht Fertig
                {
                    string message = "Vorhandene Dateien im Zielverzeichnis: " + txtZiel.Text + "werden Gelöscht. Wollen Sie fortfahren?"; 
                    string caption = "WARNUNG";
                    MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                    DialogResult result;

                    result = MessageBox.Show(message, caption, buttons);
                    if (result == System.Windows.Forms.DialogResult.No)
                    {
                        Close();
                    }
                }
                txtDelete.Text = "del /S /Q " + txtZiel.Text;

                Process cmd = new Process();
                cmd.StartInfo.FileName = "cmd.exe";
                cmd.StartInfo.RedirectStandardInput = true;
                cmd.StartInfo.RedirectStandardOutput = true;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();

                cmd.StandardInput.WriteLine(txtDelete.Text);
                cmd.StandardInput.Flush();
                cmd.StandardInput.Close();
                cmd.WaitForExit();
                Console.WriteLine(cmd.StandardOutput.ReadToEnd());


                txtBefehl.Text = "FOR /F \"delims=#\" %i IN ('dir /ad /b /s " + txtQuelle.Text + "') DO @copy \"%i\\" + txtDateiKriterien.Text + "\" " + txtZiel.Text + " /y";


                cmd.StartInfo.FileName = "cmd.exe";
                cmd.StartInfo.RedirectStandardInput = true;
                cmd.StartInfo.RedirectStandardOutput = true;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();

                cmd.StandardInput.WriteLine(txtBefehl.Text);
                cmd.StandardInput.Flush();
                cmd.StandardInput.Close();
                cmd.WaitForExit();
                Console.WriteLine(cmd.StandardOutput.ReadToEnd());



                System.IO.StreamWriter sw;
                if (!System.IO.File.Exists(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt"))
                {
                    sw = new System.IO.StreamWriter(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt");
                }
                else
                {
                    sw = new System.IO.StreamWriter(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt");
                }
                sw.WriteLine("Start: " + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss"));
                sw.Flush(); 




                sw.WriteLine("Ende: " + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss"));
                sw.Close();
            }

            private void Close()
            {
                throw new NotImplementedException();
            }
        }
    }

    Montag, 29. Juli 2019 09:17
  • OK. Zum kopieren rufst du in deinem Code in einem gesonderten Prozess die entprechenden OS-Befehle auf bzw. baust dort eine Schleife dafür.

    In diesem Falle hast du natürlich keine Möglichkeit, die Log-Einträge hinzuzufügen, so wie ich das gezeigt habe. Es gibt allerdings auh direkt in C# die Möglichkeit, dateien zu kopieren / löschen etc. Dann sieht aber die Lösung insgesamt etwas anders aus.

    Montag, 29. Juli 2019 10:04
  • Kann ich nicht die Einträge wie du in ein label oder eine textbox oder ähnliches fügen und dann als string in die Textdatei schreiben?

    Montag, 29. Juli 2019 11:01
  • using (var logfile = new StreamWriter($@"C:\Temp\{DateTime.Now.ToShortDateString()}.txt")) { logfile.WriteLine($"Source Dir: {source}"); foreach (var fi in new DirectoryInfo(source).GetFiles()) { logfile.WriteLine($"{fi.Name}"); } }

    Erstellt dieser code automatisch eine neue Textdatei?

    Montag, 29. Juli 2019 11:05
  • using (var logfile = ...

    erstellt im Grunde die Textdatei

    logfile.WriteLine($"Source Dir: {source}");

    Schreibt den Namen des Quellverzeichnisses in die Textdatei

    in der foreach(...) Schleife werden dann alle Dateiinformationen des quellverzeichnisses gelesen und der jeweilige name in die Textdatei geschrieben.

    Die schliessende geschweifte Klammer vom 

    using (var logfile = ...

    schliesst dann letztlich auch die Textdatei.

    Theoretisch könntest du vor dem

    logfile.WriteLine($"{fi.Name}");

    ein

    File.Copy(von, nach);

    einfügen, um die Dateien an dieser Stelle im Code zu kopieren

    Montag, 29. Juli 2019 11:17
  • also wenn ich diesen Teil aus meinem code entferne

                System.IO.StreamWriter sw;
                if (!System.IO.File.Exists(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt"))
                {
                    sw = new System.IO.StreamWriter(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt");
                }
                else
                {
                    sw = new System.IO.StreamWriter(@"C:\Users\hmhatd.03\Desktop\Zielordner\" + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss") + ".txt");
                }
                sw.WriteLine("Start: " + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss"));
                sw.Flush(); 




                sw.WriteLine("Ende: " + DateTime.Now.ToString("MM_dd_yyyy HH.mm.ss"));
                sw.Close();
            }

    Und anstattdessen deinen Teil einfüge und anpasse müsste es funktionieren?

    Und muss ich bei

    File.Copy(von, nach);

    von: den namen des Ordners angeben in dem die Dateien liegen?

    nach: die Textdatei?

    eingeben?

    Montag, 29. Juli 2019 11:30
  • Bzw. muss ich an der Stelle File

    File.Copy(von, nach);

    Den Ordnernamen angeben?

    Montag, 29. Juli 2019 11:34
  • Siehe hier. Das ganze wird ja in einer Schleife aufgerufen. Also den jeweiligen Dateinamen.

    Montag, 29. Juli 2019 11:35
  • Bei mir sind das aber immer wieder verschiedene Dateinamen

    Montag, 29. Juli 2019 11:39
  • Natürlich.

    foreach (var fi in new DirectoryInfo(source).GetFiles())
    liest immer aktuell aus dem angegebenen Verzeichnis (hier: source) die Liste der Dateien und arbeitet jede Datei einzeln ab. Wenn du dann also innerhalt der Schleife auf fi.Name bzw. fi.FullName zugreifst, bekommst du immer jeweils den Dateinamen (mit oder ohne Pfad) geliefert. Wenn du beim nächsten Aufruf ein anderes verzeichnis angibst und/oder sich die Dateien im Verzeichnis geändert haben, werden eben auch die geänderten Daiteien abgearbeitet.

    Montag, 29. Juli 2019 11:50
  •             using (var logfile = new System.IO.StreamWriter($@"txt{DateTime.Now.ToShortDateString()}.txt"))
                {
                    logfile.WriteLine($"Source Dir: {txtQuelle.Text}");
                    foreach (var fi in new System.IO.DirectoryInfo(txtQuelle.Text).GetFiles())
                    {
                        logfile.WriteLine($"{fi.Name}");
                    }
                }


    Wie kann ich den Teil

    $@"C:\Temp\

    in txtZiel.Text ändern?

    Bzw. den Teil

    logfile.WriteLine($"{fi.Name}");

    Muss ich nicht ändern oder doch?



    • Bearbeitet BNG.exe Montag, 29. Juli 2019 11:57
    Montag, 29. Juli 2019 11:56
  • Dein Code sieht soweit ganz ok aus. Die Logdatei hat noch keinen Pfad. Ansonsten sollte das schon mal i netwa passen.
    Montag, 29. Juli 2019 12:12
  • In meinem Fall funktioniert die logdatei auch aber ich muss sie in den vom Benutzer gewählten Zielordner legen.

    dazu habe ich ja wie man in meinem code sehen kann den

    folder browser dialog

    verwendet und in eine textbox gespeichert und nun wollte ich mit txtZiel.Text den inhalt als Pfadangabe verwenden aber dadurch stiimt die formatierung nicht mehr überein.

    Montag, 29. Juli 2019 12:15
  • OK. Ich dachte, txtZiel.Text wäre nur der Zielordner für den Kopiervorgang.

    using (var logfile = new System.IO.StreamWriter($@"{txtZiel.Text}\{DateTime.Now.ToShortDateString()}.txt"))

    Dienstag, 30. Juli 2019 06:54