Distributed file storage
- Storing metadata in the database (SQL/NoSQL)
- Storing files in the file system
- Deduplication of files by content
- Distributed storage (multiple disks)
dotnet new console --name "DfsExample"
cd DfsExample
dotnet add package DistributedFileStorage.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
program.cs:
usingDistributedFileStorage;usingMicrosoft.EntityFrameworkCore;usingMicrosoft.Extensions.DependencyInjection;// add services to the containervarservices=newServiceCollection().AddDfsEfc<string>(options =>{// add database provider options.Database.ContextConfigurator=(db)=>db.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=DfsDatabase;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False");// add path construction algorithm varrnd=newRandom();options.FileStorage.PathBuilder=(fileId)=>Path.GetFullPath($@"_dfs\fake_disk_{rnd.Next(1,3)}\{DateTime.Now:yyyy\\MM\\dd}\{fileId}");}).BuildServiceProvider();vardfs=services.GetRequiredService<IDistributedFileStorage<string>>();// uploadusingvaruploadFile=newMemoryStream(System.Text.Encoding.UTF8.GetBytes("test text"));varfileId=awaitdfs.Add(uploadFile,$"example.txt","my metadata");// get infovarfileInfo=awaitdfs.GetInfo(fileId);Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(fileInfo));// download usingvardownloadFile=File.Create("example.txt");awaitforeach(varchunkindfs.GetContent(fileId))awaitdownloadFile.WriteAsync(chunk);