![]() |
VOOZH | about |
Package moved to DiscUtils repository.
dotnet add package LTRData.ExFat.DiscUtils --version 1.0.17
NuGet\Install-Package LTRData.ExFat.DiscUtils -Version 1.0.17
<PackageReference Include="LTRData.ExFat.DiscUtils" Version="1.0.17" />
<PackageVersion Include="LTRData.ExFat.DiscUtils" Version="1.0.17" />Directory.Packages.props
<PackageReference Include="LTRData.ExFat.DiscUtils" />Project file
paket add LTRData.ExFat.DiscUtils --version 1.0.17
#r "nuget: LTRData.ExFat.DiscUtils, 1.0.17"
#:package LTRData.ExFat.DiscUtils@1.0.17
#addin nuget:?package=LTRData.ExFat.DiscUtils&version=1.0.17Install as a Cake Addin
#tool nuget:?package=LTRData.ExFat.DiscUtils&version=1.0.17Install as a Cake Tool
An exFAT accessor library.
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.
ExFat allows to manipulate an exFAT formatted partition (provided as a System.IO.Stream).
It comes with two packages:
ExFat.Core available from NuGet, which allows simple exFAT management at three different levels (partition, entry and path).ExFat.DiscUtils available from NuGet, which depends on DiscUtils 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:
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(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): 👁 Build status
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 is compatible. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 is compatible. |
| .NET Framework | net46 net46 is compatible. net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 is compatible. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 1 NuGet packages that depend on LTRData.ExFat.DiscUtils:
| Package | Downloads |
|---|---|
|
LTRData.DiscUtils.Dokan
Mounts DiscUtils IFileSystem implementations using Dokan file system driver |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 1.0.17 | 889 | 6/12/2025 | 1.0.17 is deprecated because it is no longer maintained. |
| 1.0.16 | 1,207 | 11/13/2024 | 1.0.16 is deprecated because it is no longer maintained. |
| 1.0.13 | 1,271 | 11/15/2023 | 1.0.13 is deprecated because it is no longer maintained. |
| 1.0.10 | 1,279 | 12/3/2022 | 1.0.10 is deprecated because it is no longer maintained. |