Programming (c#) Programma om de contents van elke tekstfile in elke subirectory van een hoofddirectory af te printen.

Bauhaus

Well-known member
Ik weet niet of het bestaat maar ik zoek een programma dat de contents van elke tekstfile (dus ook files met bv extinctie sln zijn tekstfiles) in elke subdirectory apart afprint (dus voor elke nieuwe file een nieuw blad) . Misschien dat dit wel mogelijk is met de command prompt/powershell.
Ik heb dus een videolectuur aangeschaft waar de files bij zitten maar wil ze liever op mijn gemak eens lezen.
 
Dit is een console app in C#. De output komt in je "Mijn Documenten" map in 1 tekstbestand "output.txt".
Mits een paar aanpassingen kan je misschien een nieuw blad per gelezen file verkrijgen, maar ik weet op dit moment niet hoe ...

C#:
static void Main(string[] args)
        {
            string folderPath = @"C:\ReadMap";

            string myDocPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            StringBuilder sb = new StringBuilder();
            foreach (string fileName in Directory.GetFiles(folderPath, "*.*"))
            {
                using (StreamReader sr = new StreamReader(fileName))
                {
                    string contents = File.ReadAllText(fileName, Encoding.UTF8);
                    sb.AppendLine(fileName + Environment.NewLine);
                    sb.AppendLine(contents);
                    sb.AppendLine();
                    sb.AppendLine();
                }
            }

            foreach (string directoryName in Directory.GetDirectories(folderPath))
            {
                foreach (string fileName in Directory.GetFiles(directoryName, "*.*"))
                {
                    using (StreamReader sr = new StreamReader(fileName))
                    {
                        string contents = File.ReadAllText(fileName, Encoding.UTF8);
                        sb.AppendLine(fileName + Environment.NewLine);
                        sb.AppendLine(contents);
                        sb.AppendLine();
                        sb.AppendLine();
                    }
                }
            }

            using (StreamWriter outfile = new StreamWriter(myDocPath + @"\output.txt"))
            {
                outfile.Write(sb.ToString());
            }
        }
 
^Bovenstaande is echter basis en bevat geen security checks noch optimalisaties:
  • Hard coded strings: De map C:\ReadMap is hard gecodeerd, wat betekent dat als iemand de code kan wijzigen, hij/zij de map kan wijzigen om andere mappen te lezen. dit is niet rechtstreeks een security issue maar ik ben voorstander van configureerbare variabelen.
  • Permissions: De code probeert bestanden te lezen uit C:\ReadMap en kan fouten genereren als het niet de juiste toestemmingen heeft om dit te doen. Zorg ervoor dat je foutafhandeling implementeert.
  • Information Disclosure: De code leest alle bestanden en hun inhoud uit de map C:\ReadMap en schrijft deze naar een bestand. Als er gevoelige informatie in deze map staat, wordt deze naar een ander bestand gekopieerd.
  • Overschrijving van Bestanden: Als er al een bestand met de naam output.txt in MyDocuments staat, wordt dit overschreven.
  • Onnodig Gebruik van StreamReader: Je maakt een StreamReader aan maar gebruikt deze niet, omdat je de File.ReadAllText methode gebruikt om de inhoud te lezen.
  • Directory Traversal: Als C:\ReadMap symbolische koppelingen bevat naar andere mappen, zou de code deze kunnen volgen en bestanden buiten deze map kunnen lezen.
  • Recursie: De code behandelt alleen de eerste laag van submappen. Als je alle submappen wilt behandelen, heb je een recursieve functie nodig.
  • Denial of Service: Als er veel grote bestanden zijn in C:\ReadMap en zijn submappen, kan dit de toepassing vertragen of crashen door geheugentekort.
  • Foutafhandeling Ontbreekt: Er is geen foutafhandeling voor het geval dat bepaalde bestands- of mapbewerkingen falen.
  • Privacy: Het kopiëren van bestandsinhoud naar een ander bestand kan privacyproblemen veroorzaken, afhankelijk van de aard van de gegevens.
  • Performance: De code gebruikt een StringBuilder om de inhoud van elk bestand bij te houden. Als er veel of zeer grote bestanden zijn, kan dit geheugenproblemen veroorzaken.
 
Laatst bewerkt:
Als je het zelf beter kan doen, schrijf dan zelf een stuk code ipv commentaar te geven want je helpt Bauhaus er niet mee.

Edit:

^Bovenstaande is echter basis en bevat geen security checks nog optimalisaties:
Ik weet dat het maandag is, maar ik zou het appreciëren als je correct Nederlands wil gebruiken op dit forum want mijn haren komen er recht van van gebrekkig Nederlands.

Nog is in deze context anders geschreven ...
 
Laatst bewerkt:
Oh zeker. Het is al even geleden, maar op basis van wat ik eerder plaatste:

C#:
using System;
using System.IO;
using System.Text;

class Program
{
    private const string SourceFolderPath = @"C:\ReadMap";
    private static readonly string OutputFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "output.txt");

    static void Main()
    {
        try
        {
            StringBuilder sb = new StringBuilder();

            ProcessDirectory(SourceFolderPath, sb);

            File.WriteAllText(OutputFilePath, sb.ToString());
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Er is een fout opgetreden: {ex.Message}");
        }
    }

    private static void ProcessDirectory(string directoryPath, StringBuilder sb)
    {
        // Verwerk de bestanden in de huidige map
        ProcessFiles(directoryPath, sb);

        // Verwerk de submappen recursief
        foreach (var subDir in Directory.GetDirectories(directoryPath))
        {
            ProcessDirectory(subDir, sb);
        }
    }

    private static void ProcessFiles(string directoryPath, StringBuilder sb)
    {
        foreach (var filePath in Directory.GetFiles(directoryPath))
        {
            sb.AppendLine(filePath);
            sb.AppendLine(File.ReadAllText(filePath, Encoding.UTF8));
            sb.AppendLine();
            sb.AppendLine();
        }
    }
}
 
Laatst bewerkt:
Terug
Bovenaan