An exFAT accessor library.
ExFat allows to manipulate an exFAT formatted partition (provided as a System.IO.Stream).
It comes with two packages:
- The core package
ExFat.Coreavailable from NuGet, which allows simple exFAT management at three different levels (partition, entry and path). - The DiscUtils package
ExFat.DiscUtilsavailable from NuGet, which depends onDiscUtilspackage.
Currently, ExFat.Core does what it says: files/directories manipulation at any level.
DiscUtils support is on its way and should be released in the very next few days.
ExFat.Core works at three levels:
- Lowest level: partition access. This allows to manipulate clusters, allocation bitmap, directory entries and clusterr streams.
- Middle level: entry access. Files/directories can be used to read/write content.
- High level: path access. This works as you would expect using file paths.
ExFat.DiscUtils is also a high-level access (using paths) with implementation for DiscUtils.
Because it is still under development, you can see pending features state here.
All examples assume you have a Stream containing an exFAT partition.
// Access at partition-level. Most efficient, most dangerous.// Integrity is not guaranteed at this level, // user needs to make all neceassary operations in right order.using(varpartition=newExFatPartition(partitionStream)){// returns all entries (including bitmap, volume label, etc.) from root directoryvarentries=partition.GetEntries(partition.RootDirectoryDataDescriptor);// returns all files/directories meta entriesvarmetaEntries=partition.GetMetaEntries(partition.RootDirectoryDataDescriptor);// assuming there is one, of course (but we're in a sample)varsomeDirectory=metaEntries.First(e =>e.IsDirectory);vardirectoryMetaEntries=partition.GetMetaEntries(someDirectory.DataDescriptor);varsomeFile=metaEntries.First(e =>!e.IsDirectory);using(vardataStream=partition.OpenDataStream(someFile.DataDescriptor,FileAccess.Read)){}}// Access at entry level. Quite fast, since user has to track entries.// Integrity is guaranteed. File attributes are not honored (maybe one day...)using(varentryFilesystem=newExFatEntryFilesystem(partitionStream)){varsomeFileEntry=entryFilesystem.FindChild(filesystem.RootDirectory,"someFile");using(varfileStream=entryFilesystem.OpenFile(someFileEntry,FileAccess.Read){}// finding one file in a directory requires two steps
var someDirectoryEntry = entryFilesystem.FindChild(filesystem.RootDirectory,"someDirectory");varsomeChildFileEntry= entryFilesystem.FindChild(someDirectoryEntry,"someDirectory");}// Access at path level. Uses a path cache to retrieve entries, // so speed is not as good (but not that bad either)// since there is not drive, paths only specify the directory chain// (so "a\b\c" for example)using(varpathFilesystem=newExFatPathFilesystem(partitionStream)){varrootEntries=pathFilesystem.EnumerateEntries("\"); // "" works too for root
varchildEntries= pathFilesystem.EnumerateEntries(@"\somedir");// "somedir" works toousing(vars=pathFilesystem.Open(@"a\b\c",FileMode.Open,FileAccess.Read){}}Current build status (for people who care... If you ever meet one):