استخدام .NET لإدارة الدلائل والملفات في Azure Data Lake Storage Gen2

توضح لك هذه المقالة كيفية استخدام .NET لإنشاء وإدارة الدلائل والملفات في حسابات التخزين التي تحتوي على مساحة اسم هرمية.

للتعرف على كيفية الحصول على قوائم التحكم في الوصول (ACL) الخاصة بالدلائل والملفات وتعيينها وتحديثها، راجع استخدام .NET لإدارة قوائم التحكم بالوصول في Azure Data Lake Storage Gen2.

حزمة (NuGet)العينات مرجع واجهة برمجة التطبيقات تعيين Gen1 إلى Gen2تقديم الملاحظات

المتطلبات الأساسية

إعداد مشروعك

للبدء، قم بتثبيت حزمة Azure.Storage.Files.DataLake NuGet.

لمزيد من المعلومات حول كيفية تثبيت حزم NuGet، راجع تثبيت الحزم وإدارتها في Visual Studio باستخدام مدير الحِزَم NuGet.

ثم أضف هذه العبارات باستخدام العبارات إلى أعلى ملف التعليمات البرمجية.

using Azure;
using Azure.Storage.Files.DataLake;
using Azure.Storage.Files.DataLake.Models;
using Azure.Storage;
using System.IO;

الاتصال إلى الحساب

لاستخدام المقتطفات في هذه المقالة، ستحتاج إلى إنشاء مثيل DataLakeServiceClient يمثل حساب التخزين.

الاتصال باستخدام مفتاح حساب

هذه هي أسهل طريقة للاتصال بحساب.

يقوم هذا المثال بإنشاء مثيل DataLakeServiceClient باستخدام مفتاح حساب.

public static void GetDataLakeServiceClient(ref DataLakeServiceClient dataLakeServiceClient,
    string accountName, string accountKey)
{
    StorageSharedKeyCredential sharedKeyCredential =
        new StorageSharedKeyCredential(accountName, accountKey);

    string dfsUri = "https://" + accountName + ".dfs.core.windows.net";

    dataLakeServiceClient = new DataLakeServiceClient
        (new Uri(dfsUri), sharedKeyCredential);
}

الاتصال باستخدام Azure Active Directory (Azure AD)

يمكنك استخدام مكتبة عميل هوية Azure ل .NET لمصادقة التطبيق الخاص بك باستخدام Azure AD.

ينشئ هذا المثال مثيل DataLakeServiceClient باستخدام معرف عميل وسر عميل ومعرف مستأجر. للحصول على هذه القيم، راجع الحصول على رمز مميز من Azure AD لتخويل الطلبات من تطبيق عميل.

public static void GetDataLakeServiceClient(ref DataLakeServiceClient dataLakeServiceClient,
    String accountName, String clientID, string clientSecret, string tenantID)
{

    TokenCredential credential = new ClientSecretCredential(
        tenantID, clientID, clientSecret, new TokenCredentialOptions());

    string dfsUri = "https://" + accountName + ".dfs.core.windows.net";

    dataLakeServiceClient = new DataLakeServiceClient(new Uri(dfsUri), credential);
}

ملاحظة

لمزيد من الأمثلة، راجع مكتبة عميل هوية Azure للحصول على وثائق .NET..

إنشاء حاوية

تعمل الحاوية كنظام ملفات لملفاتك. يمكنك إنشاء واحد عن طريق استدعاء الأسلوب DataLakeServiceClient.CreateFileSystem.

ينشئ هذا المثال حاوية باسم my-file-system.

public async Task<DataLakeFileSystemClient> CreateFileSystem
    (DataLakeServiceClient serviceClient)
{
    return await serviceClient.CreateFileSystemAsync("my-file-system");
}

إنشاء دليل

إنشاء مرجع دليل عن طريق استدعاء الأسلوب DataLakeFileSystemClient.CreateDirectoryAsync.

يضيف هذا المثال دليلا مسمى my-directory إلى حاوية، ثم يضيف دليلا فرعيا باسم my-subdirectory.

public async Task<DataLakeDirectoryClient> CreateDirectory
    (DataLakeServiceClient serviceClient, string fileSystemName)
{
    DataLakeFileSystemClient fileSystemClient =
        serviceClient.GetFileSystemClient(fileSystemName);

    DataLakeDirectoryClient directoryClient =
        await fileSystemClient.CreateDirectoryAsync("my-directory");

    return await directoryClient.CreateSubDirectoryAsync("my-subdirectory");
}

إعادة تسمية دليل أو نقله

إعادة تسمية أو نقل دليل عن طريق استدعاء الأسلوب DataLakeDirectoryClient.RenameAsync. تمرير مسار الدليل المطلوب معلمة.

يعيد هذا المثال تسمية دليل فرعي إلى الاسم my-subdirectory-renamed.

public async Task<DataLakeDirectoryClient>
    RenameDirectory(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory/my-subdirectory");

    return await directoryClient.RenameAsync("my-directory/my-subdirectory-renamed");
}

ينقل هذا المثال دليلا مسمى إلى دليل فرعي لدليل مسمى my-subdirectory-renamedmy-directory-2.

public async Task<DataLakeDirectoryClient> MoveDirectory
    (DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
         fileSystemClient.GetDirectoryClient("my-directory/my-subdirectory-renamed");

    return await directoryClient.RenameAsync("my-directory-2/my-subdirectory-renamed");
}

حذف دليل

حذف دليل عن طريق استدعاء الأسلوب DataLakeDirectoryClient.Delete.

يحذف هذا المثال دليلا باسم my-directory.

public void DeleteDirectory(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory");

    directoryClient.Delete();
}

Upload ملف إلى دليل

أولا، قم بإنشاء مرجع ملف في الدليل الهدف عن طريق إنشاء مثيل من فئة DataLakeFileClient . Upload ملف عن طريق استدعاء الأسلوب DataLakeFileClient.AppendAsync. تأكد من إكمال التحميل عن طريق الاتصال بطريقة DataLakeFileClient.FlushAsync.

يقوم هذا المثال بتحميل ملف نصي إلى دليل باسم my-directory.

public async Task UploadFile(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory");

    DataLakeFileClient fileClient = await directoryClient.CreateFileAsync("uploaded-file.txt");

    FileStream fileStream =
        File.OpenRead("C:\\Users\\contoso\\Temp\\file-to-upload.txt");

    long fileSize = fileStream.Length;

    await fileClient.AppendAsync(fileStream, offset: 0);

    await fileClient.FlushAsync(position: fileSize);

}

تلميح

إذا كان حجم الملف كبيرا، فسيتعين على التعليمات البرمجية إجراء مكالمات متعددة إلى DataLakeFileClient.AppendAsync. فكر في استخدام طريقة DataLakeFileClient.UploadAsync بدلا من ذلك. وبهذه الطريقة، يمكنك تحميل الملف بأكمله في مكالمة واحدة.

راجع القسم التالي للحصول على مثال.

Upload ملف كبير إلى دليل

استخدم الأسلوب DataLakeFileClient.UploadAsync لتحميل ملفات كبيرة دون الحاجة إلى إجراء مكالمات متعددة إلى الأسلوب DataLakeFileClient.AppendAsync.

public async Task UploadFileBulk(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory");

    DataLakeFileClient fileClient = directoryClient.GetFileClient("uploaded-file.txt");

    FileStream fileStream =
        File.OpenRead("C:\\Users\\contoso\\file-to-upload.txt");

    await fileClient.UploadAsync(fileStream);

}

تنزيل من دليل

أولا، قم بإنشاء مثيل DataLakeFileClient الذي يمثل الملف الذي تريد تنزيله. استخدم الأسلوب DataLakeFileClient.ReadAsync ثم قم بتحليل قيمة الإرجاع للحصول على كائن دفق . استخدم أي واجهة برمجة تطبيقات لمعالجة ملفات .NET لحفظ وحدات البايت من الدفق إلى ملف.

يستخدم هذا المثال BinaryReader و FileStream لحفظ وحدات البايت في ملف.

public async Task DownloadFile(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory");

    DataLakeFileClient fileClient =
        directoryClient.GetFileClient("my-image.png");

    Response<FileDownloadInfo> downloadResponse = await fileClient.ReadAsync();

    BinaryReader reader = new BinaryReader(downloadResponse.Value.Content);

    FileStream fileStream =
        File.OpenWrite("C:\\Users\\contoso\\my-image-downloaded.png");

    int bufferSize = 4096;

    byte[] buffer = new byte[bufferSize];

    int count;

    while ((count = reader.Read(buffer, 0, buffer.Length)) != 0)
    {
        fileStream.Write(buffer, 0, count);
    }

    await fileStream.FlushAsync();

    fileStream.Close();
}

قائمة محتويات الدليل

سرد محتويات الدليل عن طريق استدعاء الأسلوب FileSystemClient.GetPathsAsync ثم تعداد من خلال النتائج.

يقوم هذا المثال بطباعة أسماء كل ملف موجود في دليل باسم my-directory.

public async Task ListFilesInDirectory(DataLakeFileSystemClient fileSystemClient)
{
    IAsyncEnumerator<PathItem> enumerator =
        fileSystemClient.GetPathsAsync("my-directory").GetAsyncEnumerator();

    await enumerator.MoveNextAsync();

    PathItem item = enumerator.Current;

    while (item != null)
    {
        Console.WriteLine(item.Name);

        if (!await enumerator.MoveNextAsync())
        {
            break;
        }

        item = enumerator.Current;
    }

}

راجع أيضًا