5
\$\begingroup\$

Previous post: Display all files in a folder (object) along with nested subdirectories

Task: Given a main directory/folder, list all the files from it and if this directory contains nested sub-directories, list their files as well.

Background: It was bought to my attention that the use of dummyCounter is considered bad practices. But, I still haven't managed to find a different approach that suits my needs. Currently, my dummyCounter is used to prevent duplicating the parentFolder, as well as allowing me to break my loop.

My previous approach: I have used folderStack.Any() as a condition for my while loop, but that resulted in the last nested sub-directory not getting shown. Then I tried using a "dept counter" but that proved too difficult to intercorporate while using a Stack approach to hold my data.

I would greatly appreciate community feedback. And should there be any problems with my post regarding community rules, let me know. - I tried not to repeat any of my previous issues.

_Folder Partial View

@{
string GlyphionFolderIcon = "glyphicon glyphicon-folder-open";
}
<div class="row">
<div class="col-sm-2">
 <a class="btn"
 role="button"
 data-toggle="collapse"
 href="#@Model.Id"
 aria-expanded="false"
 aria-controls="@Model.Id">
 <span class="@GlyphionFolderIcon"></span>
 </a>
</div>
<div class="col-sm-5">@Model.Id</div>
<div class="col-sm-5">@Model.Name</div>

_File Partial View

@{
string GlyphionModelIcon = "glyphicon glyphicon-paperclip";
}
<div class="row">
<div class="col-sm-2">
 <a class="btn"
 role="button"
 href="@[email protected]"
 target="_blank">
 <span class="@GlyphionModelIcon"></span>
 </a>
</div>
<div class="col-sm-5">@Model.Id</div>
<div class="col-sm-5">@Model.Name</div>
</div>

_Layout View

@foreach (var parentFolder in Model)
{
Stack<Folder> folderStack = new Stack<Folder>();
folderStack.Push(parentFolder);
var currentFolder = folderStack.Pop();
int dummyCounter = 1;
//Parent folder
@Html.Partial("_Folder", parentFolder);
<div class="collapse" id="@currentFolder.Id">
 @if (currentFolder.FoldersContained != 0)
 {
 do
 {
 //Prevents a copy of the parent folder 
 //otherwise, this display nested folders
 if (dummyCounter != 1)
 {
 @Html.Partial("_Folder", currentFolder);
 }
 <div class="collapse" id="@currentFolder.Id">
 @if (currentFolder.FoldersContained > 0)
 {
 for (int i = currentFolder.FoldersContained; i > 0; i--)
 {
 //Pushes all nested directories into my stack
 //in reverse inorder to display the top directory
 folderStack.Push(currentFolder.Folders[i - 1]);
 dummyCounter++;
 }
 }
 @if (currentFolder.FilesContained != 0)
 {
 // Should they contain any files, display them
 foreach (var file in currentFolder.Files)
 {
 @Html.Partial("_File", file);
 }
 }
 </div>
 //Ends the while loop
 if (folderStack.Count == 0)
 {
 dummyCounter = 0;
 }
 //Prepares the next nested folder object
 if (folderStack.Count != 0)
 {
 currentFolder = folderStack.Pop();
 }
 // I make use of a dummy counter inorder to break the loop
 // should there no longer be any nested directories and files
 // left to display
 } while (dummyCounter != 0);
 }
 <!-- //Finally, display all files in the parent folder, should there be any-->
 @if (parentFolder.FilesContained != 0)
 {
 foreach (var file in parentFolder.Files)
 {
 @Html.Partial("_File", file);
 }
 }
</div>
}
asked Dec 20, 2018 at 12:44
\$\endgroup\$
2
  • 1
    \$\begingroup\$ Oh yeah, this is much cooler now ;-) \$\endgroup\$ Commented Dec 20, 2018 at 12:48
  • \$\begingroup\$ @t3chb0t Thank you. I'm glad for the continuous support you provided so far. It has given me a good impression of code review while introducing me to some of its guidelines =) \$\endgroup\$ Commented Dec 20, 2018 at 13:04

1 Answer 1

2
\$\begingroup\$

You should remove

int dummyCounter = 1; 

and change the if's checking for folderStack.Count to an if..else like so

 //Ends the while loop
 if (folderStack.Count == 0)
 {
 break;
 } 
 else
 {
 currentFolder = folderStack.Pop();
 } 

While writing this I thought about this

if (dummyCounter != 1)
{
 @Html.Partial("_Folder", currentFolder);
}

as well and again checked the program-flow. If we assume that the parentFolder.FoldersContained != 0 we output the files of the parentFolder twice. One time inside the do..while loop and one time after the loop. We could remove this if and this

//Parent folder
@Html.Partial("_Folder", parentFolder); 

like so

@foreach (var parentFolder in Model)
{
 Stack<Folder> folderStack = new Stack<Folder>();
 folderStack.Push(parentFolder);
 @while (folderStack.Count > 0)
 {
 var currentFolder = folderStack.Pop();
 @Html.Partial("_Folder", currentFolder);
 <div class="collapse" id="@currentFolder.Id">
 @for (int i = currentFolder.FoldersContained; i > 0; i--)
 {
 //Pushes all nested directories into my stack
 //in reverse inorder to display the top directory
 folderStack.Push(currentFolder.Folders[i - 1]);
 }
 // Should they contain any files, display them
 @foreach (var file in currentFolder.Files)
 {
 @Html.Partial("_File", file);
 }
 </div>
 }
}

I know that this isn't exactly the same as you had before (the most outer <div class="collapse" id="@currentFolder.Id"> is missing) but it is much clearer and easier to read. If you need this div's I would suggest to just use a separate method to process the contained folders and files of the parentFolders.

answered Dec 27, 2018 at 10:52
\$\endgroup\$
1
  • \$\begingroup\$ Thanks for the advices, even if they didn't nessercary solve the issue. I will how ever use them for further improvements. I think you're right about finding a different approach. And also made me aware that, just like your code doesn't work with having subdirectories showned under my parent folder. Any subdirectories greater than 1 level down wouldn't be showned as expected either unfortunately. Wasn't aware of that mistakes giving the data I was working with didn't offer such a senario. Much appriciated. \$\endgroup\$ Commented Jan 16, 2019 at 19:15

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.