Home > Back-end >  C# Minor Issue when Iterating through file
C# Minor Issue when Iterating through file

Time:10-13

I have a program that iterates through all files from directories and subdirectories, it's working smoothly but there is just a minor issue that my brain can't solve. The one finding the simplest way to solve it is a genius :)

Here is the code :

    int hello(string locat)
    {
        string[] files = Directory.GetFiles(locat);
        string[] dirs = Directory.GetDirectories(locat);
        int cpt = 0;
        
        foreach (var file in files)
        {
            try
            {
                textBox1.AppendText(file "\r\n");

                cpt  ;
                textBox2.AppendText(cpt.ToString() "\r\n");
            }
            catch { }
        }

        
        foreach (string directory in dirs)
        {
            try
            {
                cpt  = hello(directory);
            }
            catch { }
        }

        return cpt;

    }

So the problem is that the output of cpt inside textBox2 have a logic behavior but a behavior that is not adequate for my needs

This is how it looks like :

1
2
3
1
2
1
2
...

And I want it to be 1,2,3,4,5,6,7,8,9,...

I tried with EnumerateFiles instead of GetFiles, it was working smoothly too but i got some permissions issue and I'm working on .NET framework for this project

CodePudding user response:

I haven't tried this but you can just make hello take cpt as a parameter.

    int hello(string locat, ref int cpt)
    {
        string[] files = Directory.GetFiles(locat);
        string[] dirs = Directory.GetDirectories(locat);
        
        foreach (var file in files)
        {
            try
            {
                textBox1.AppendText(file "\r\n");

                cpt  ;
                textBox2.AppendText(cpt.ToString() "\r\n");
            }
            catch { }
        }

        
        foreach (string directory in dirs)
        {
            try
            {
                hello(directory, ref cpt);
            }
            catch { }
        }

        return cpt;

    }

Edit:

You need to run it with ref

int cpt = 0;
hello("C:\\", ref cpt);

Here is the output I get if I run it with the following folder structure:

testfolder/
 > folder1/
  > a.txt
  > b.txt
  > c.txt
 > folder2/
  > a.txt
  > b.txt
  > c.txt
 > folder3/
  > a.txt
  > b.txt
  > c.txt

Output:

D:\testfolder\folder1\a.txt
1
D:\testfolder\folder1\b.txt
2
D:\testfolder\folder1\c.txt
3
D:\testfolder\folder2\a.txt
4
D:\testfolder\folder2\b.txt
5
D:\testfolder\folder2\c.txt
6
D:\testfolder\folder3\a.txt
7
D:\testfolder\folder3\b.txt
8
D:\testfolder\folder3\c.txt
9

CodePudding user response:

A variation that avoids ref

int hello(string locat, int counter = 0)
{
    string[] files = Directory.GetFiles(locat);
    string[] dirs = Directory.GetDirectories(locat);
        

    foreach (var file in files)
    {
        try
        {
            textBox2.AppendText(file   "\r\n");

            counter  ;
            textBox2.AppendText(counter.ToString()   "\r\n");
        }
        catch { }
    }


    foreach (string directory in dirs)
    {
        try
        {
            counter = hello(directory, counter);
        }
        catch { }
    }

    return counter;

}

CodePudding user response:

Your variable cpt is locally scoped, so you get a new variable instance for every recursive call. You can instead use a field (and don't increment it based on the result of your recursive call):

int cpt = 0;
void hello(string locat)
{
    string[] files = Directory.GetFiles(locat);
    string[] dirs = Directory.GetDirectories(locat);


    foreach (var file in files)
    {
        try
        {
            textBox1.AppendText(file   "\r\n");

            cpt  ;
            textBox2.AppendText(cpt.ToString()   "\r\n");
        }
        catch { }
    }


    foreach (string directory in dirs)
    {
        try
        {
            hello(directory);
        }
        catch { }
    }

}

This code is not thread-safe.

  •  Tags:  
  • c#
  • Related