frostfs-sdk-csharp/README.md
Pavel Gross 704ce41173 [#23] Client: Refactoring to optimize memory usage
Signed-off-by: Pavel Gross <p.gross@yando.com>
2024-09-12 11:56:26 +03:00

2.1 KiB

frostfs-sdk-csharp

C# implementation of FrostFS SDK.

Prerequisites

Get the key for your wallet

  1. Get the address
cat <path_to_your_wallet> | jq .accounts[0].address | tr -d '"'
  1. Get the key
neo-go wallet export -w <path_to_your_wallet> -d <address_from_p1>

Example usage

Container

using FrostFS.SDK;
using FrostFS.SDK.ClientV2;

using Microsoft.Extensions.Options;

var Key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq";
var Host = "http://172.22.33.44:8080";

var options = Options.Create(new SingleOwnerClientSettings
{
    Key = Key,
    Host = Host
});

using var client = Client.GetSingleOwnerInstance(options);

await foreach (var cid in client.ListContainersAsync())
{
    await client.DeleteContainerAsync(new PrmContainerDelete(cid));
}

var placementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1));

var createContainerParam = new PrmContainerCreate(
    new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))));

var containerId = await client.CreateContainerAsync(createContainerParam);

using var fileStream = File.OpenRead(@"C:\Users\Paul\Pictures\cat.jpeg");

var param = new PrmObjectPut
{
    Header = new FrostFsObjectHeader(
                containerId: containerId,
                type: FrostFsObjectType.Regular,
                [new FrostFsAttribute("fileName", "test")]),
    Payload = fileStream
};

FrostFsObjectId objectId = await client.PutObjectAsync(param);

var filter = new FilterByAttribute(FrostFsMatchType.Equals, "fileName", "test");

await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter] }))
{
    var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(containerId, objId));
}

var @object = await client.GetObjectAsync(new PrmObjectGet(containerId, objectId));

var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes);

ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{
    ms.Write(chunk.Value.Span);
}