[Mono-dev] Announce: Mono.Fuse 0.3.0

Jonathan Pryor jonpryor at vt.edu
Mon Sep 11 06:04:16 EDT 2006

Mono.Fuse is a C# binding for the FUSE library.

This release features a near complete change in the public FileSystem
API; a complete API change list is available at:


Hopefully this will be the last major API change, though I would
appreciate any and all feedback on the current API.

The most "interesting" change is for OnReadDirectory().  It was

	protected virtual Errno
		OnReadDirectory(string path, out string[] paths, 
		OpenedFileInfo info);

It is now:

	protected virtual Errno
		OnReadDirectory(string path, OpenedPathInfo info, 
		out IEnumerable<FileSystemEntry> paths);

That is, `out string[]' is now `out IEnumerable<FileSystemEntry>'.  This
allows for two things:

1.  A performance boost: an array containing the names of all file
system entries in `path' doesn't need to be created all at once.  For
large directories (hundreds-thousands of files), this can really slow
things down.  The IEnumerable interface allows file system entries to be
retrieved piecemeal.

2.  C# iterators can be used to implement directory reading.  From

	private IEnumerable<FileSystemEntry> GetEntries ()
	    yield return ".";
	    yield return "..";
	    yield return "hello";
	    yield return "data";
	    if (have_data_im)
	        yield return "data.im";

	protected override Errno OnReadDirectory (string path,
	        OpenedPathInfo info, 
                out IEnumerable<FileSystemEntry> paths)
	    paths = GetEntries ();
	    return 0;

I think (2) is particularly cool.

Design Questions: 

OnReadDirectory() uses FileSystemEntry, which is:

	class FileSystemEntry 
	    public string Path {get;}
	    public Stat Stat;
	    public FileSystemEntry (string path);
	    public static implicit operator FileSystemEntry (string);

This has a public field Stat, which is against normal design guidelines.
This was done because Stat is a 96-byte structure, so these shouldn't be
created on the stack that often, and a read/write Property would require
much more stack use.  Is this reasonable?

The Stat field is optional.  It is only used Stat.st_ino is non-zero (as
FUSE 2.5.3 currently only reads the st_ino & st_mode fields, though I
imagine this could be extended in the future).  Is this reasonable?  Or
should an alternative mechanism be used to determine when the Stat
instance should be used?

Is it a good idea to have the implicit conversion from string to


Mono.Fuse 0.3.0 is available for download at:


 - Jon

More information about the Mono-devel-list mailing list