This library will help you create new Dokan User Mode File System quicker and easier.
When implementing new File System for Dokan, you would be implementing IDokanOperations
interface and writing roughly 24 functions.
Although the functions in IDokanOperations
seems trivial, you would face a lot of trouble creating a working file system because you do not know how to correctly respond to each calls made to your IDokanOperations
.
Fortunately, Dokan-net has provided Mirror.cs which seems to have encapsulated the knowledge of creating a working file system in Dokan. The Mirror sample
use File/Directory/Path classes in System.IO
namespace to handle the requests.
I have extracted those calls into an interface called IDokanDisk
which is available to you in this Library. So you can implement a working File system without having an in-depth understanding of
why CreateFile
function gets called when Windows Explorer trying to list files in a folder!
- Create a new class which implements
IDokanDisk
. There are 22 functions to implement, just be patient and follow the guide in XML Comments. Trust me, it's a lot more trivial than having to implementCreateFile
function inIDokanOperations
which does almost everything.
using NC.DokanFS;
namespace NC.CrossDrive.App
{
public class CrossDriveDokanDisk : IDokanDisk
{
// implement the operations here
}
}
- Create a new class which implments
IDokanFileContext
. YourIDokanDisk
'sCreateFileContext
function should return a new instance of this class.
This class is where you will perform read/write operations to your backend storage. If you do not want to support an operation, just throw IOException
Flush
method will be called when the application request the write buffer to be flushed - so do that!
The Dispose
method of this class will gets called when an application using the file close the file handle. So in Dispose
, make sure to clean up everything related to the file.
using NC.DokanFS;
namespace NC.CrossDrive.App
{
public class CrossDriveFileContext : IDokanFileContext
{
// implement Read, Close, Flush Dispose
}
}
- Create new instance of
DokanFrontend
and pass an instance of yourIDokanDisk
to it.DokanFrontend
class is the modified Mirror.cs sample which calls toIDokanDisk
instead of vairousSystem.IO.*
classes.
using NC.DokanFS;
namespace NC.CrossDrive.App
{
class Program
{
static void Main(string[] args)
{
var crossdrive = new CrossDriveDokanDisk();
var dokan = new DokanFrontend(crossdrive, "CrossDrive");
dokan.Mount(@"H:\");
Console.WriteLine("Press ENTER to Exit.");
Console.Read();
dokan.Unmount();
}
}
}
Run and enjoy your new file system!
There are few helpful classes in this namespace to help you get started even faster.
ReadOnlyDiskBase
: inherit this class to create a read-only file systemReadOnlyFileContextBase
: inherit this class for read-only file contextBlockBasedReadOnlyFileContextBase
: inherit this class for read-only file context which fetch data from backend storage in blocksBlockBasedFileContextBase
: inherit this class for file context which fetch/write data from backend storage in blocks
MIT License.