# frostfs-sdk-csharp C# implementation of FrostFS SDK. ## Prerequisites ### Get the key for your wallet 1. Get the address ```bash cat | jq .accounts[0].address | tr -d '"' ``` 2. Get the key ```bash neo-go wallet export -w -d ``` ## Example usage ### Container ```csharp using FrostFS.SDK.ClientV2; using FrostFS.SDK.ModelsV2; using FrostFS.SDK.ModelsV2.Enums; using FrostFS.SDK.ModelsV2.Netmap; var fsClient = Client.GetInstance(, ); // List containers var containersIds = await fsClient.ListContainersAsync(); // Create container var placementPolicy = new PlacementPolicy(true, new Replica(1)); var containerId = await fsClient.CreateContainerAsync( new Container( BasicAcl.PublicRW, placementPolicy ) ); // Get container var container = await fsClient.GetContainerAsync(cId); // Delete container await fsClient.DeleteContainerAsync(containerId); ``` ### Object ```csharp using FrostFS.SDK.ClientV2; using FrostFS.SDK.ModelsV2; using FrostFS.SDK.ModelsV2.Enums; using FrostFS.SDK.ModelsV2.Netmap; var fsClient = Client.GetInstance(, ); // Search regular objects var objectsIds = await fsClient.SearchObjectAsync( cId, ObjectFilter.RootFilter() ); // Put object var f = File.OpenRead("cat.jpg"); var cat = new ObjectHeader( containerId: cId, type: ObjectType.Regular, new ObjectAttribute("Filename", "cat.jpg") ); var oId = await fsClient.PutObjectAsync(cat, f); // Get object header var objHeader = await fsClient.GetObjectHeadAsync(cId, oId); // Get object var obj = await fsClient.GetObjectAsync(cId, oId); ``` ### Custom client cut ```csharp using FrostFS.SDK.ClientV2; using FrostFS.SDK.ModelsV2; using FrostFS.SDK.ModelsV2.Enums; using FrostFS.SDK.ModelsV2.Netmap; using FrostFS.SDK.ClientV2.Extensions; using FrostFS.SDK.ClientV2.Interfaces; var fsClient = Client.GetInstance(, ); ContainerId containerId = ; string fileName = ; await PutObjectClientCut(fsClient, containerId, fileName); static async Task PutObjectClientCut(IFrostFSClient fsClient, ContainerId containerId, string fileName) { List sentObjectIds = []; FrostFS.SDK.ModelsV2.Object? currentObject; var partSize = 1024 * 1024; var buffer = new byte[partSize]; var largeObject = new LargeObject(containerId); var split = new Split(); var fileInfo = new FileInfo(fileName); var fullLength = (ulong)fileInfo.Length; var fileNameAttribute = new ObjectAttribute("fileName", fileInfo.Name); using var stream = File.OpenRead(fileName); while (true) { var bytesCount = await stream.ReadAsync(buffer.AsMemory(0, partSize)); split.Previous = sentObjectIds.LastOrDefault(); largeObject.AppendBlock(buffer, bytesCount); currentObject = new FrostFS.SDK.ModelsV2.Object(containerId, bytesCount < partSize ? buffer.Take(bytesCount).ToArray() : buffer) .AddAttribute(fileNameAttribute) .SetSplit(split); if (largeObject.PayloadLength == fullLength) break; var objectId = await fsClient.PutSingleObjectAsync(currentObject); sentObjectIds.Add(objectId); } if (sentObjectIds.Any()) { largeObject.CalculateHash() .AddAttribute(fileNameAttribute); currentObject.SetParent(largeObject); var objectId = await fsClient.PutSingleObjectAsync(currentObject); sentObjectIds.Add(objectId); var linkObject = new LinkObject(containerId, split.SplitId, largeObject) .AddChildren(sentObjectIds) .AddAttribute(fileNameAttribute); _ = await fsClient.PutSingleObjectAsync(linkObject); return currentObject.GetParentId(); } return await fsClient.PutSingleObjectAsync(currentObject); } ```