LTRData.ExFat.Core
1.0.16
dotnet add package LTRData.ExFat.Core --version 1.0.16
NuGet\Install-Package LTRData.ExFat.Core -Version 1.0.16
<PackageReference Include="LTRData.ExFat.Core" Version="1.0.16" />
paket add LTRData.ExFat.Core --version 1.0.16
#r "nuget: LTRData.ExFat.Core, 1.0.16"
// Install LTRData.ExFat.Core as a Cake Addin #addin nuget:?package=LTRData.ExFat.Core&version=1.0.16 // Install LTRData.ExFat.Core as a Cake Tool #tool nuget:?package=LTRData.ExFat.Core&version=1.0.16
ExFat
An exFAT accessor library.
Fork
This fork is LTRData.ExFat.
This is a fork of ExFat.DiscUtils. The main goal of this fork is more efficient, safer and faster code at the cost of dropping support for some old versions of .NET Framework. It depends of LTRData.DiscUtils fork of DiscUtils instead of the upstream DiscUtils.DiscUtils, to get better performance in asynchronous calls and Span<byte>
-based calls.
Summary
ExFat allows to manipulate an exFAT formatted partition (provided as a System.IO.Stream
).
It comes with two packages:
- The core package
ExFat.Core
available from NuGet, which allows simple exFAT management at three different levels (partition, entry and path). - The DiscUtils package
ExFat.DiscUtils
available from NuGet, which depends onDiscUtils
package.
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.
Samples
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(var partition = new ExFatPartition(partitionStream))
{
// returns all entries (including bitmap, volume label, etc.) from root directory
var entries = partition.GetEntries(partition.RootDirectoryDataDescriptor);
// returns all files/directories meta entries
var metaEntries = partition.GetMetaEntries(partition.RootDirectoryDataDescriptor);
// assuming there is one, of course (but we're in a sample)
var someDirectory = metaEntries.First(e => e.IsDirectory);
var directoryMetaEntries = partition.GetMetaEntries(someDirectory.DataDescriptor);
var someFile = metaEntries.First(e => !e.IsDirectory);
using(var dataStream = 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(var entryFilesystem = new ExFatEntryFilesystem(partitionStream))
{
var someFileEntry = entryFilesystem.FindChild(filesystem.RootDirectory, "someFile");
using(var fileStream = entryFilesystem.OpenFile(someFileEntry, FileAccess.Read)
{ }
// finding one file in a directory requires two steps
var someDirectoryEntry = entryFilesystem.FindChild(filesystem.RootDirectory, "someDirectory");
var someChildFileEntry = 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(var pathFilesystem = new ExFatPathFilesystem(partitionStream))
{
var rootEntries = pathFilesystem.EnumerateEntries("\"); // "" works too for root
var childEntries = pathFilesystem.EnumerateEntries(@"\somedir"); // "somedir" works too
using(var s = pathFilesystem.Open(@"a\b\c", FileMode.Open, FileAccess.Read)
{ }
}
Current build status (for people who care... If you ever meet one):
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net46 is compatible. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.5.5)
- System.Threading.Tasks.Extensions (>= 4.5.4)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.8
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.6.0)
- System.Threading.Tasks.Extensions (>= 4.6.0)
- System.ValueTuple (>= 4.5.0)
-
.NETStandard 2.0
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.6.0)
- System.Threading.Tasks.Extensions (>= 4.6.0)
- System.ValueTuple (>= 4.5.0)
-
.NETStandard 2.1
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.6.0)
- System.Threading.Tasks.Extensions (>= 4.6.0)
- System.ValueTuple (>= 4.5.0)
-
net8.0
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.6.0)
- System.Threading.Tasks.Extensions (>= 4.6.0)
- System.ValueTuple (>= 4.5.0)
-
net9.0
- LTRData.DiscUtils.Streams (>= 1.0.48)
- System.Memory (>= 4.6.0)
- System.Threading.Tasks.Extensions (>= 4.6.0)
- System.ValueTuple (>= 4.5.0)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on LTRData.ExFat.Core:
Package | Downloads |
---|---|
LTRData.DiscUtils.Dokan
Mounts DiscUtils IFileSystem implementations using Dokan file system driver |
|
LTRData.ExFat.DiscUtils
DiscUtils wrapper for ExFAT |
GitHub repositories
This package is not used by any popular GitHub repositories.