Recursive Directory Listing

okibi spam at ratedo.com
Fri Feb 15 03:09:12 PST 2008


okibi Wrote:

> okibi Wrote:
> 
> > Tim Burrell Wrote:
> > 
> > > okibi wrote:
> > > > Hello,
> > > > 
> > > > I was wondering if anyone could tell me how I would go about doing this. I need a function that can list all the files and directories in a given directory, and return an array that I can use that can reference each file, each folder, and each file within each subfolder. Is this possible?
> > > > 
> > > > Thanks!
> > > 
> > > tango.io.FileScan :).
> > > 
> > > If you're using Phobos, a recursive file scanner is pretty much the
> > > easiest thing you can write!
> > > 
> > > Pseudo code:
> > > 
> > > scan(char [] Path, ref char [][] Paths) {
> > > 	Paths ~= Path
> > > 
> > > 	if (!Path.isDirectory)
> > > 		return
> > > 
> > > 	ListOfPaths = getContentsOfDir(Path)
> > > 	foreach (Item; ListOfPaths)
> > > 		scan(Path)
> > > }
> > > 
> > > Obviously you can get more creative and store an array of structures
> > > which contain file system information such as whether or not the path is
> > > a file or a directory, etc, but that's the basic idea.
> > > 
> > > Even if you're not using Tango, you can always look at the source code
> > > to see how they are doing it:
> > > http://dsource.org/projects/tango/docs/current/source/tango.io.FileScan.html
> > > 
> > > Hope this helps!
> > 
> > Actually, I was wondering if D had a function (or function within Phobos) that allowed recursive directory scanning. Anyways, here's what I wrote:
> > 
> > void dirList(char[] path)
> > {
> > 	if (!isdir(path))
> > 		writefln("File: ", path);
> > 	else
> > 	{
> > 		writefln("Directory: ", path);
> > 		char[][] pathsList = listdir(path);
> > 		char[][] dirs;
> > 		char[][] files;
> > 		foreach (item; pathsList)
> > 		{
> > 			if (isdir(path~"/"~item))
> > 				dirs ~= path~"/"~item;
> > 			else
> > 				files ~= path~"/"~item;
> > 		}
> > 		foreach (file; files)
> > 			writefln("File: ", file);
> > 		foreach (dir; dirs)
> > 			dirList(dir);
> > 	}
> > }
> > 
> > Can this be optimized at all?
> > 
> > Thanks!
> 
> In reply to myself, that code will only pick up the first directory in each subdirectory.

I take that back. Just outputting what it finds to the command line works as expected. However, if used within GtkD to add selections to a TreeView, it does not.


More information about the Digitalmars-d-learn mailing list