Home > Net >  How to get the folder before the last one?
How to get the folder before the last one?

Time:12-26

First I'm getting the last folder (3) then I want to get the folder before it (2) but in my code it's getting the first folder (1) and I want to get (2).

var lastWrittenFolder = new DirectoryInfo(textBoxPath.Text).GetDirectories()
                       .OrderByDescending(d => d.LastWriteTimeUtc).First();

var firstWrittenFolder = new DirectoryInfo(textBoxPath.Text).GetDirectories()
                       .OrderBy(d => d.CreationTimeUtc).First();

var F = Directory.GetFiles(lastWrittenFolder.FullName, "*.gif").Last();
var LF = Directory.GetFiles(firstWrittenFolder.FullName, "*.gif").Last();`

the variable names are wrong I will fix it but I want instead firstWrittenFolder that it will be : writenFolderBeforeLast so in the end I will get the last file of the last folder and the last file in the folder before.

This :

var firstWrittenFolder = new DirectoryInfo(textBoxPath.Text).GetDirectories()
                        .OrderBy(d => d.CreationTimeUtc).First();

Should get the folder before :

var lastWrittenFolder = new DirectoryInfo(textBoxPath.Text).GetDirectories()
                        .OrderByDescending(d => d.LastWriteTimeUtc).First();

and in the end to check first if there are more then 1 folders because then it should not get the one before because it will not be exist yet.

I tried the code above but getting the first folder instead the one before the last. I want to get the last file from the last folder and the last file from the folder before the last.

CodePudding user response:

You can get the second last folder like and the last file from it using the below logic.

var folders = new DirectoryInfo(textBoxPath.Text).GetDirectories()
                .OrderByDescending(d => d.LastWriteTimeUtc);

if (folders.Count() > 1)
{
    var writtenFolderBeforeLast = folders.Skip(1).Take(1).First();

    var lastFileInFolderBeforeLast = Directory.GetFiles(writtenFolderBeforeLast.FullName, "*.gif").Last();
}

CodePudding user response:

Please note, that GetDirectories() returns you an array which you can easily play with:

// We have an array as the result:
DirectoryInfo[] allDirs = new DirectoryInfo(textBoxPath.Text).GetDirectories();

// After sorting the array, we can easily get...
Array.Sort(allDirs, (a, b) => a.LastWriteTimeUtc.CompareTo(b.LastWriteTimeUtc));

// ... its first item
var firstWrittenFolder = allDirs.Length > 0 ? allDirs[0] : default;
// ... second from the end item
var beforeLast = allDirs.Length > 1 ? allDirs[allDirs.Length - 2] : default;

// Files within the second last directory
if (allDirs.Length > 1) {
  var files = allDirs[allDirs.Length - 2].GetFiles();

  ...
}

Addressing IO can well be time consuming, we should avoid calling .GetDirectories() too often, that's why we do it once, get an array and then work with this array only.

  • Related