Thread overview
How to use tango's FileScan correctly?
Oct 14, 2010
qwesx
Oct 14, 2010
Moritz Warning
Oct 14, 2010
Moritz Warning
Oct 14, 2010
Moritz Warning
Oct 14, 2010
qwesx
October 14, 2010
Hello!

I'm trying out some things in D (with tango) and tried to build a *very* primitive indexing program. One function requires to run through a directory (without recursion) and get me all the files/folders in there.

So after reading the documentation I found that tango.io.FileScan basically does what I need. It's just that I can't get it to work. All examples there use some filter, but I don't need one. And the other stuff I tried (and which compiled) gives me either a wrong number of files in my debug output, or none at all.

Here's (part of) my code:

FileScan scan = new FileScan();
// only one of those was used at a time, the others are commented
// dir is a char[] with an existing (absolute) directory:
scan(dir, "*");
scan(dir, ".*");
scan(dir, "*.*");
scan(dir, "");
scan = scan.sweep(dir, false);


FilePath[] myFolders = scan.folders();
FilePath[] myFiles = scan.files();
char[][] err = scan.errors();
Stdout("found folders: ")(myFolders.length)("\n")();
Stdout("found files  : ")(myFiles.length)("\n")();
Stdout("errors:\n")();
foreach (char[] e; err)
  Stdout(e)("\n")();


The result was always:

found folders: 0
found files  : 0
errors:
% _

I think I'm doing something very wrong here. And it's possibly because I don't understand the documentation.

Can you help me get this to work?



Regards
qwesx
October 14, 2010
I suspect there is a bug.
You could use FilePath.toList() as an alternative for now.

foreach(path; FilePath(".").toList())
{
  if(path.isFolder)
    folder_counter++;
  else
    file_counter++;
}

On Thu, 14 Oct 2010 15:31:47 +0000, qwesx wrote:

> Hello!
> 
> I'm trying out some things in D (with tango) and tried to build a *very* primitive indexing program. One function requires to run through a directory (without recursion) and get me all the files/folders in there.
> 
> So after reading the documentation I found that tango.io.FileScan basically does what I need. It's just that I can't get it to work. All examples there use some filter, but I don't need one. And the other stuff I tried (and which compiled) gives me either a wrong number of files in my debug output, or none at all.
> 
> Here's (part of) my code:
> 
> FileScan scan = new FileScan();
> // only one of those was used at a time, the others are commented // dir
> is a char[] with an existing (absolute) directory: scan(dir, "*");
> scan(dir, ".*");
> scan(dir, "*.*");
> scan(dir, "");
> scan = scan.sweep(dir, false);
> 
> 
> FilePath[] myFolders = scan.folders(); FilePath[] myFiles =
> scan.files();
> char[][] err = scan.errors();
> Stdout("found folders: ")(myFolders.length)("\n")(); Stdout("found files
>  : ")(myFiles.length)("\n")(); Stdout("errors:\n")();
> foreach (char[] e; err)
>   Stdout(e)("\n")();
> 
> 
> The result was always:
> 
> found folders: 0
> found files  : 0
> errors:
> % _
> 
> I think I'm doing something very wrong here. And it's possibly because I don't understand the documentation.
> 
> Can you help me get this to work?
> 
> 
> 
> Regards
> qwesx

October 14, 2010
Here is the bug report (patch proposal included):

http://dsource.org/projects/tango/ticket/2003

On Thu, 14 Oct 2010 15:31:47 +0000, qwesx wrote:

> Hello!
> 
> I'm trying out some things in D (with tango) and tried to build a *very* primitive indexing program. One function requires to run through a directory (without recursion) and get me all the files/folders in there.
> 
> So after reading the documentation I found that tango.io.FileScan basically does what I need. It's just that I can't get it to work. All examples there use some filter, but I don't need one. And the other stuff I tried (and which compiled) gives me either a wrong number of files in my debug output, or none at all.
> 
> Here's (part of) my code:
> 
> FileScan scan = new FileScan();
> // only one of those was used at a time, the others are commented // dir
> is a char[] with an existing (absolute) directory: scan(dir, "*");
> scan(dir, ".*");
> scan(dir, "*.*");
> scan(dir, "");
> scan = scan.sweep(dir, false);
> 
> 
> FilePath[] myFolders = scan.folders(); FilePath[] myFiles =
> scan.files();
> char[][] err = scan.errors();
> Stdout("found folders: ")(myFolders.length)("\n")(); Stdout("found files
>  : ")(myFiles.length)("\n")(); Stdout("errors:\n")();
> foreach (char[] e; err)
>   Stdout(e)("\n")();
> 
> 
> The result was always:
> 
> found folders: 0
> found files  : 0
> errors:
> % _
> 
> I think I'm doing something very wrong here. And it's possibly because I don't understand the documentation.
> 
> Can you help me get this to work?
> 
> 
> 
> Regards
> qwesx

October 14, 2010
Ok,

as I've found out, FileScan is only for locating a set of files. the preferred way is to use the virtual file system (VFS):

http://dsource.org/projects/tango/wiki/ChapterVFS

Examples: http://www.dsource.org/projects/tango/wiki/VfsZipAndLinesExample http://dsource.org/projects/tango/browser/trunk/doc/example/vfs/vfscan.d http://dsource.org/projects/tango/browser/trunk/doc/example/vfs

But I think FilePath.toList()
is enough for your plans.


On Thu, 14 Oct 2010 15:31:47 +0000, qwesx wrote:

> Hello!
> 
> I'm trying out some things in D (with tango) and tried to build a *very* primitive indexing program. One function requires to run through a directory (without recursion) and get me all the files/folders in there.
> 
> So after reading the documentation I found that tango.io.FileScan basically does what I need. It's just that I can't get it to work. All examples there use some filter, but I don't need one. And the other stuff I tried (and which compiled) gives me either a wrong number of files in my debug output, or none at all.
> 
> Here's (part of) my code:
> 
> FileScan scan = new FileScan();
> // only one of those was used at a time, the others are commented // dir
> is a char[] with an existing (absolute) directory: scan(dir, "*");
> scan(dir, ".*");
> scan(dir, "*.*");
> scan(dir, "");
> scan = scan.sweep(dir, false);
> 
> 
> FilePath[] myFolders = scan.folders(); FilePath[] myFiles =
> scan.files();
> char[][] err = scan.errors();
> Stdout("found folders: ")(myFolders.length)("\n")(); Stdout("found files
>  : ")(myFiles.length)("\n")(); Stdout("errors:\n")();
> foreach (char[] e; err)
>   Stdout(e)("\n")();
> 
> 
> The result was always:
> 
> found folders: 0
> found files  : 0
> errors:
> % _
> 
> I think I'm doing something very wrong here. And it's possibly because I don't understand the documentation.
> 
> Can you help me get this to work?
> 
> 
> 
> Regards
> qwesx

October 14, 2010
On Thu, 14 Oct 2010 18:07:20 +0000, Moritz Warning wrote:

> Ok,
> 
> as I've found out, FileScan is only for locating a set of files. the preferred way is to use the virtual file system (VFS):
> 
> http://dsource.org/projects/tango/wiki/ChapterVFS
> 
> Examples: http://www.dsource.org/projects/tango/wiki/VfsZipAndLinesExample http://dsource.org/projects/tango/browser/trunk/doc/example/vfs/vfscan.d http://dsource.org/projects/tango/browser/trunk/doc/example/vfs
> 
> But I think FilePath.toList()
> is enough for your plans.


I'll take a look at it.
Thank all three of you, I got it working with toList()
:-)


Regards
qwesx