DevelopmentHelpers.Storage.Core
4.0.11
See the version list below for details.
dotnet add package DevelopmentHelpers.Storage.Core --version 4.0.11
NuGet\Install-Package DevelopmentHelpers.Storage.Core -Version 4.0.11
<PackageReference Include="DevelopmentHelpers.Storage.Core" Version="4.0.11" />
paket add DevelopmentHelpers.Storage.Core --version 4.0.11
#r "nuget: DevelopmentHelpers.Storage.Core, 4.0.11"
// Install DevelopmentHelpers.Storage.Core as a Cake Addin #addin nuget:?package=DevelopmentHelpers.Storage.Core&version=4.0.11 // Install DevelopmentHelpers.Storage.Core as a Cake Tool #tool nuget:?package=DevelopmentHelpers.Storage.Core&version=4.0.11
DevelopmentHelpers.Storage.Core
This library allows easier access to Azure Storage as well as Local directory sturcture. With few command you can upload or download entire sturucture to local or Azure storage.
Code Example
Following example shows how to use Azure Storage Classes
Create IStorage -- IStorage interface has two implementation local & Azure: use any dependency injection container IStorage storage = new AzureStorage(config,logger); or IStorage storage = new FileSystemStorage(config,logger);
Use methods available on the interface: e.g: UploadDirectoryAsync(DirectoryInfo directory, string container);
To Add in the Web Application
- Create Appsettings
"DevelopmentHelpers": { "AzureConfiguration": { "AccountName": "account name", "AccountKey": "account key", "UseHttps": "True" } } - Add in the Startup file //Add Azure Storage and make sure required values exists in app settings services.AddAzureStorage(Configuration);
- To Use it private readonly IStorage _storage; public IndexModel(IStorage storage) { _storage = storage; }
- Create Appsettings
Motivation
I needed a consistent and easy to use library in .net Standard which I can use it with any project, and be able to download and upload complete directories.
API Reference
Tests
Describe and show how to run the tests with code examples. Tests are as follows: AzureTest
/*************************** AzureStorageTest ************************* using System; using System.Collections.Generic; using System.IO; using Azure.Storage.Blobs.Models; using DevelopmentHelpers.Storage.Core.Helpers; using DevelopmentHelpers.Storage.Core.Implementations.Azure; using DevelopmentHelpers.Storage.Core.Interfaces; using DevelopmentHelpers.Storage.Core.Tests.Helpers; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace DevelopmentHelpers.Storage.Core.Tests { [TestClass] public class AzureStorageCoreTest {
[AssemblyInitialize]
public static void AssemblyInit(TestContext context)
{
Console.WriteLine("AssemblyInit " + context.TestName);
}
static IStorage _storage;
static StringHelper _stringHelper;
private static string _localDirectoryPath;
static DirectoryHelper _dirHelper;
[ClassInitialize]
public static void AzureStorageTestInit(TestContext context)
{
_storage = new AzureStorage(ConfigHelper.Instance.AzureConfiguration, ConfigHelper.Instance.LoggerFactory.CreateLogger<AzureStorage>());
_stringHelper = new StringHelper();
_dirHelper = new DirectoryHelper();
_localDirectoryPath = Path.Combine("C:\\temp", "AzureStorageCoreTest");
if (Directory.Exists(_localDirectoryPath))
{
Directory.Delete(_localDirectoryPath, true);
}
Directory.CreateDirectory(_localDirectoryPath);
Console.WriteLine("AzureStorageTestInit " + context.TestName);
}
[TestMethod]
public void ValidateTest()
{
Assert.IsTrue(_storage.Validate());
}
[TestMethod]
public void CreateContainerAndDeleteContainerTest()
{
string testContainerName = $"{Guid.NewGuid():N}";
var response = _storage.CreateContainerAsync(testContainerName, false).Result;
Assert.IsNotNull(response);
Assert.IsTrue(_storage.DeleteAsync(testContainerName).Result);
}
[TestMethod]
[DataRow(1, 1024)]
[DataRow(1, 36870637)]
public void AzureUploadFileInfoTest(int count, long size)
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
FileHelper fileHelper = new FileHelper(tempDirectoryPath);
for (int i = 0; i < count; i++)
{
string fileName = $"{Guid.NewGuid()}.txt";
fileHelper.CreateFile(size, fileName);
FileInfo fileInfo = new FileInfo(Path.Combine(tempDirectoryPath, fileName));
Assert.IsNotNull(_storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result);
var blobUri = _storage.GetUri(containerName, fileName);
Assert.IsNotNull(blobUri);
}
}
[TestMethod]
[DataRow(1, 1024)]
[DataRow(1, 36870637)]
[DataRow(1, 536870637)]
[DataRow(1, 1073741824)] //1 GB
[DataRow(1, 2147483648)]// 2 GB
[DataRow(1, 5368709120)]// 5 gb
[DataRow(1, 10737418240)]// 10 GB
public void AzureUploadFileInChunksTest(int count, long size)
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
FileHelper fileHelper = new FileHelper(tempDirectoryPath);
for (int i = 0; i < count; i++)
{
string fileName = $"{Guid.NewGuid()}.txt";
fileHelper.CreateFile(size, fileName);
string completeFilePath = Path.Combine(tempDirectoryPath, fileName);
var uri = _storage.UploadInChunks(completeFilePath, containerName, fileName, MimeTypes.txt).Result;
Assert.IsNotNull(uri);
}
}
[TestMethod]
[DataRow(1, 1024)]
[DataRow(1, 36870637)]
[DataRow(1, 536870637)]
//[DataRow(1, 1073741824)] //1 GB
//[DataRow(1, 2147483648)]// 2 GB
//[DataRow(1, 5368709120)]// 5 gb
//[DataRow(1, 10737418240)]// 10 GB
public void AzureDownloadFileTest(int count, long size)
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
string downloadDirectoryPath = Path.Combine(_localDirectoryPath, $"{Guid.NewGuid():N}");
Directory.CreateDirectory(downloadDirectoryPath);
FileHelper fileHelper = new FileHelper(tempDirectoryPath);
for (int i = 0; i < count; i++)
{
string fileName = $"{Guid.NewGuid()}.txt";
fileHelper.CreateFile(size, fileName);
FileInfo fileInfo = new FileInfo(Path.Combine(tempDirectoryPath, fileName));
Assert.IsNotNull(_storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result);
var blobUri = _storage.GetUri(containerName, fileName);
Assert.IsNotNull(blobUri);
//Download
var file = _storage.DownloadToFileAsync(blobUri, downloadDirectoryPath).Result;
Assert.IsNotNull(file);
}
}
[TestMethod]
public void AzureDownloadFileTest()
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
Directory.CreateDirectory(tempDirectoryPath);
string testfile = Path.Combine(tempDirectoryPath, $"{Guid.NewGuid()}.txt");
_stringHelper.CreatetestFile(testfile);
FileInfo fileInfo = new FileInfo(testfile);
var url = _storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result;
var file = _storage.DownloadToFileAsync(url, tempDirectoryPath).Result;
Assert.IsNotNull(file);
}
[TestMethod]
public void AzureDownloadToStreamAsyncTest()
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
Directory.CreateDirectory(tempDirectoryPath);
string testfile = Path.Combine(tempDirectoryPath, $"{Guid.NewGuid()}.txt");
_stringHelper.CreatetestFile(testfile);
FileInfo fileInfo = new FileInfo(testfile);
var url = _storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result;
var file = _storage.DownloadToStreamAsync(url, tempDirectoryPath);
Assert.IsNotNull(file);
}
[TestMethod]
public void GetStorageContainerTest()
{
string tempDirectory = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, tempDirectory);
_dirHelper.CreateTempDirectory(tempDirectoryPath);
var storageContainer = _storage.GetStorageContainerAsync(tempDirectory).Result;
Assert.IsNotNull(storageContainer);
}
[TestMethod]
public void DownloadContainerTest()
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
_dirHelper.CreateTempDirectory(tempDirectoryPath);
//Upload the directory
var created = _storage.UploadDirectoryAsync(tempDirectoryPath, containerName).Result;
Assert.IsNotNull(created);
string downloadDirectory = $"{Guid.NewGuid():N}";
string downloadDirectoryPath = Path.Combine(_localDirectoryPath, downloadDirectory);
bool result = _storage.DownloadContainer(containerName, downloadDirectoryPath).Result;
Assert.IsTrue(result);
}
[TestMethod]
public void AzureUploadDirectoryAndZipAsyncTest()
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
var tempPath = _dirHelper.CreateTempDirectory(tempDirectoryPath);
DirectoryInfo info = new DirectoryInfo(tempPath);
var created = _storage.UploadDirectoryAsync(info, containerName).Result;
Assert.IsNotNull(created);
string zipFolder = "Zip";
string zipFolderPath = Path.Combine(_localDirectoryPath, zipFolder);
if (!Directory.Exists(zipFolderPath))
Directory.CreateDirectory(zipFolderPath);
var zipFile = _storage.CreateZipFromContainerAsync(info.Name, zipFolderPath, $"{containerName}.zip")
.Result;
Assert.IsNotNull(zipFile);
}
[TestMethod]
public void AzureDownloadStorageContainerTest()
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
var tempPath = _dirHelper.CreateTempDirectory(tempDirectoryPath);
DirectoryInfo info = new DirectoryInfo(tempPath);
var created = _storage.UploadDirectoryAsync(info, containerName).Result;
Assert.IsNotNull(created);
var storageContainer = _storage.GetStorageContainerAsync(containerName).Result;
Assert.IsNotNull(storageContainer);
}
[TestMethod]
public void AzureSystemUploadFileAsyncInfoTest()
{
//Test File
string fileName = $"{Guid.NewGuid()}.txt";
string testFile = Path.Combine(Path.GetTempPath(), fileName);
_stringHelper.CreatetestFile(testFile);
FileInfo fileInfo = new FileInfo(testFile);
//Container
string containerName = $"{Guid.NewGuid():N}";
var url = _storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result;
Assert.IsNotNull(url);
Assert.IsNotNull(_storage.GetUri(containerName, fileName));
var file = _storage.DownloadToFileAsync(url, _localDirectoryPath).Result;
Assert.IsNotNull(file);
var stream = _storage.DownloadToStreamAsync(url, _localDirectoryPath).Result;
var tempFilePath = Path.Combine(_localDirectoryPath, "test.txt");
if (File.Exists(tempFilePath))
File.Delete(tempFilePath);
using (FileStream fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
fileStream.Write(bytes, 0, bytes.Length);
stream.Close();
}
Assert.IsNotNull(stream);
}
[TestMethod]
public void CreateLargeFileZipTest()
{
//Create local Temp Directory where Container will be downloaded
string zipFolder = "LargeFolder";
string zipFolderPath = Path.Combine(_localDirectoryPath, zipFolder);
if (Directory.Exists(zipFolderPath))
Directory.Delete(zipFolderPath, true);
//Create and upload temp directory to Azure Container
string tempContainer = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, tempContainer);
var tempPath = _dirHelper.CreateTempDirectory(tempDirectoryPath, 1);
DirectoryInfo info = new DirectoryInfo(tempPath);
var uploaded = _storage.UploadDirectoryAsync(info, tempContainer).Result;
Assert.IsNotNull(uploaded);
var zipFile = _storage.CreateZipFromContainerAsync(tempContainer, zipFolderPath, $"{tempContainer}.zip")
.Result;
Assert.IsNotNull(zipFile);
}
[TestMethod]
public void AzureGetContainerTest()
{
var blobContainerList = _storage.GetContainersAsync().Result;
Assert.IsInstanceOfType(blobContainerList, typeof(List<BlobContainerItem>));
Assert.IsTrue(true);
}
//
[TestMethod]
[DataRow(5, 1024)]
public void ListBlobsAsyncTest(int count, long size)
{
string containerName = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, containerName);
FileHelper fileHelper = new FileHelper(tempDirectoryPath);
for (int i = 0; i < count; i++)
{
string fileName = $"{Guid.NewGuid()}.txt";
fileHelper.CreateFile(size, fileName);
}
DirectoryInfo infos = new DirectoryInfo(tempDirectoryPath);
foreach (var fileInfo in infos.GetFiles())
{
var url = _storage.UploadFileAsync(fileInfo, MimeTypes.txt, containerName).Result;
Assert.IsNotNull(url);
}
var blobItems = _storage.ListBlobsAsync(containerName).Result;
Assert.IsInstanceOfType(blobItems, typeof(List<BlobItem>));
//Delete the container
_storage.DeleteAsync(containerName);
Assert.IsTrue(true);
}
[TestMethod]
public void LocalGetContainerTest()
{
//Create local Temp Directory where Container will be downloaded
string localTempDirectoryDownload = "localTempDirectoryDownload";
string localTempDirectoryDownloadPath = Path.Combine(_localDirectoryPath, localTempDirectoryDownload);
if (Directory.Exists(localTempDirectoryDownloadPath))
Directory.Delete(localTempDirectoryDownloadPath);
//Create and upload temp directory to Azure Container
string tempContainer = $"{Guid.NewGuid():N}";
string tempDirectoryPath = Path.Combine(_localDirectoryPath, tempContainer);
var tempPath = _dirHelper.CreateTempDirectory(tempDirectoryPath);
DirectoryInfo info = new DirectoryInfo(tempPath);
var created = _storage.UploadDirectoryAsync(info, tempContainer).Result;
Assert.IsNotNull(created);
var storageContainer = _storage.GetStorageContainerAsync(tempContainer).Result;
Assert.IsNotNull(storageContainer);
//Save Container to Local Directory
var localSavedPath = _storage.SaveStorageContainerAsync(storageContainer, localTempDirectoryDownloadPath).Result;
Assert.IsNotNull(localSavedPath);
}
[ClassCleanup]
public static void ClassCleanup()
{
var containers = _storage.GetContainersAsync().Result;
foreach (BlobContainerItem container in containers)
{
var deleted = _storage.DeleteAsync(container.Name).Result;
Assert.IsTrue(deleted);
}
//Delete temp directory
if (Directory.Exists(_localDirectoryPath))
Directory.Delete(_localDirectoryPath, true);
Console.WriteLine("AzureStorageTestInit Cleanup");
}
[AssemblyCleanup]
public static void AssemblyCleanup()
{
Console.WriteLine("Assembly Cleanup");
}
}
}
*****************End FileSystemStorage Test/
License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. 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 was computed. 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. |
-
net6.0
- Azure.Storage.Blobs (>= 12.14.1)
- Microsoft.Extensions.Configuration.Abstractions (>= 7.0.0)
- Microsoft.Extensions.DependencyInjection (>= 7.0.0)
- Microsoft.Extensions.Logging (>= 7.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 7.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
7.0.19 | 41 | 11/14/2024 |
7.0.18 | 258 | 10/11/2024 |
7.0.17 | 92 | 10/9/2024 |
7.0.16 | 118 | 9/30/2024 |
7.0.15 | 201 | 8/13/2024 |
7.0.14 | 108 | 8/2/2024 |
7.0.11 | 104 | 5/31/2024 |
7.0.10 | 100 | 5/23/2024 |
7.0.9 | 94 | 5/23/2024 |
7.0.8 | 181 | 4/10/2024 |
7.0.7 | 144 | 2/16/2024 |
7.0.6 | 128 | 2/7/2024 |
7.0.5 | 107 | 1/29/2024 |
7.0.4 | 126 | 1/16/2024 |
7.0.3 | 146 | 12/26/2023 |
7.0.2 | 145 | 12/15/2023 |
7.0.1 | 119 | 12/15/2023 |
7.0.0 | 195 | 11/14/2023 |
6.0.5 | 182 | 10/23/2023 |
6.0.4 | 241 | 8/2/2023 |
6.0.3 | 139 | 7/27/2023 |
6.0.2 | 157 | 7/11/2023 |
6.0.1 | 161 | 6/22/2023 |
6.0.0 | 167 | 5/4/2023 |
5.0.3 | 199 | 4/27/2023 |
5.0.2 | 239 | 4/11/2023 |
5.0.1 | 267 | 2/22/2023 |
5.0.0 | 386 | 11/10/2022 |
4.0.11 | 344 | 11/10/2022 |
4.0.10 | 328 | 11/10/2022 |
4.0.9 | 453 | 9/6/2022 |
4.0.8 | 492 | 7/25/2022 |
4.0.7 | 443 | 7/25/2022 |
4.0.6 | 437 | 7/25/2022 |
4.0.5 | 466 | 7/14/2022 |
4.0.4 | 145 | 7/14/2022 |
4.0.3 | 551 | 3/24/2022 |
4.0.2 | 204 | 12/16/2021 |
4.0.1 | 164 | 12/16/2021 |
4.0.0 | 911 | 11/29/2021 |
3.0.3 | 596 | 10/15/2020 |
3.0.2 | 473 | 9/30/2020 |
3.0.1 | 446 | 9/29/2020 |
3.0.0 | 491 | 9/16/2020 |
2.0.2 | 622 | 7/8/2020 |
2.0.1 | 592 | 12/25/2019 |
2.0.0 | 514 | 12/25/2019 |
1.0.6 | 553 | 12/5/2019 |
1.0.5 | 652 | 6/2/2019 |
1.0.4 | 749 | 11/30/2018 |
1.0.3 | 781 | 11/12/2018 |
1.0.2 | 752 | 11/12/2018 |
1.0.1 | 752 | 11/12/2018 |
1.0.0 | 724 | 11/12/2018 |
Added log statements