Benutzer mit den meisten Antworten
Dateinamen aus einem Ordner auslesen und in eine Textdatei schreiben.

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.
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}"); } }
- Bearbeitet Christoph Biegner Montag, 29. Juli 2019 07:53
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. August 2019 12:39
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. August 2019 13:55
-
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"))
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. August 2019 12:39
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. August 2019 13:55
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}"); } }
- Bearbeitet Christoph Biegner Montag, 29. Juli 2019 07:53
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. August 2019 12:39
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. August 2019 13:55
-
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.
- Bearbeitet Christoph Biegner 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();
}
}
}
-
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.
-
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?
-
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
-
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?
-
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. -
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
-
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.
-
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"))
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. August 2019 12:39
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. August 2019 13:55