نقل البيانات باستخدام Data Movement library

إشعار

تتضمن هذه المقالة إرشادات للعمل مع الإصدار 2.0.XX من مكتبة Azure Storage Data Movement. الإصدار 2.0.XX حاليا في وضع الصيانة، وتتلقى المكتبة إصلاحات لسلامة البيانات ومشاكل الأمان فقط. لن تتم إضافة وظائف أو ميزات جديدة، ولن تدعم المكتبة إصدارات خدمة التخزين الجديدة.

الإصدارات التجريبية من مكتبة حركة البيانات الحديثة قيد التطوير حاليا. لمزيد من المعلومات، راجع مكتبة عميل Azure Storage Data Movement Common ل .NET على GitHub.

تعتبر مكتبة نقل بيانات تخزين Azure مكتبة مفتوحة المصدر عبر المنصات مصممة لتحميل وتنزيل ونسخ الكائنات الثنائية كبيرة الحجم والملفات عالية الأداء. توفر مكتبة نقل البيانات طُرقًا ملائمة غير متوفرة في مكتبة عميل تخزين Azure for .NET. توفر هذه الطرق القدرة على تعيين عدد العمليات المتوازية، وتتبع تقدم النقل، واستئناف النقل الملغي بسهولة، وأكثر من ذلك بكثير.

تستخدم هذه المكتبة أيضًا .NET Core، ما يعني أنه يمكنك استخدامها عند إنشاء تطبيقات .NET لـ Windows وLinux وmacOS. لمعرفة المزيد حول .NET Core، راجع وثائق .NET Core. تعمل هذه المكتبة أيضًا مع تطبيقات .NET Framework التقليدية لنظام التشغيل Windows.

يُبين هذا المستند كيفية إنشاء تطبيق NET Core console. الذي يعمل على أنظمة تشغيل Windows وLinux وmacOS وينفذ السيناريوهات التالية:

  • تحميل الملفات والدلائل إلى تخزين كائن ثنائي كبير الحجم.
  • تحديد عدد العمليات المتوازية عند نقل البيانات.
  • تتبع تقدم نقل البيانات.
  • استئناف نقل البيانات الملغاة.
  • انسخ الملف من عنوان URL إلى تخزين كائن ثنائي كبير الحجم.
  • نسخ من تخزين كائن ثنائي كبير الحجم إلى تخزين كائن ثنائي كبير الحجم.

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

الإعداد

  1. تفضل بزيارة دليل تثبيت .NET Core لتثبيت .NET Core SDK. عند تحديد بيئتك، اختر خيار سطر الأوامر.
  2. من سطر الأوامر، قم بإنشاء دليل لمشروعك. انتقل إلى هذا الدليل، ثم اكتب dotnet new console -o <sample-project-name> لإنشاء مشروع وحدة تحكم C#‎.
  3. افتح هذا الدليل في Visual Studio Code. يمكن تنفيذ هذه الخطوة بسرعة عبر سطر الأوامر عن طريق الكتابة code . في Windows.
  4. قم بتثبيت ملحق C# من Visual Studio Code Marketplace. ابدأ تشغيل Visual Studio Code.
  5. في هذه المرحلة، يجب أن ترى مطالبتين. أحدها لإضافة "الأصول المطلوبة لإنشاء وتصحيح الأخطاء." انقر "نعم." مطالبة أخرى هي لاستعادة التبعيات التي لم يتم حلها. انقر فوق "استعادة."
  6. تعديل launch.json ضمن .vscode لاستخدام المحطة الطرفية الخارجية كوحدة تحكم. يجب قراءة هذا الإعداد ك "console": "externalTerminal"
  7. يسمح لك رمز Visual Studio بتصحيح أخطاء تطبيقات .NET Core. اضغط F5 لتشغيل التطبيق الخاص بك وتحقق من أن الإعداد الخاص بك يعمل. يجب أن ترى "مرحبًا بالعالم!" مطبوعة إلى وحدة التحكم.

أضف مكتبة نقل البيانات إلى مشروعك

  1. أضف أحدث إصدار من مكتبة Data Movement إلى dependencies قسم من <project-name>.csproj الملف. في وقت كتابة هذا التقرير، سيكون هذا الإصدار "Microsoft.Azure.Storage.DataMovement": "0.6.2"
  2. يجب عرض مطالبة لاستعادة مشروعك. انقر فوق الزر "استعادة ". يمكنك أيضا استعادة المشروع من سطر الأوامر عن طريق كتابة الأمر dotnet restore في جذر دليل المشروع.

تعديل <project-name>.csproj:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Storage.DataMovement" Version="0.6.2" />
        </ItemGroup>
    </Project>

إعداد الهيكل للتطبيق خاصتك

أول شيء نفعله هو إعداد رمز "الهيكل" لتطبيقنا. يطالبنا هذا الرمز باسم حساب التخزين ومفتاح الحساب ويستخدم بيانات الاعتماد هذه لإنشاء كائن CloudStorageAccount . يُستخدم هذا العنصر للتفاعل مع حساب التخزين خاصتنا في جميع سيناريوهات النقل. كما يطالبنا الرمز باختيار نوع عملية النقل التي نود تنفيذها.

تعديل Program.cs:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.DataMovement;

namespace DMLibSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Enter Storage account name:");
            string accountName = Console.ReadLine();

            Console.WriteLine("\nEnter Storage account key:");
            string accountKey = Console.ReadLine();

            string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
            CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);

            ExecuteChoice(account);
        }

        public static void ExecuteChoice(CloudStorageAccount account)
        {
            Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
            int choice = int.Parse(Console.ReadLine());

            if(choice == 1)
            {
                TransferLocalFileToAzureBlob(account).Wait();
            }
            else if(choice == 2)
            {
                TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
            }
            else if(choice == 3)
            {
                TransferUrlToAzureBlob(account).Wait();
            }
            else if(choice == 4)
            {
                TransferAzureBlobToAzureBlob(account).Wait();
            }
        }

        public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
        {

        }

        public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
        {

        }
    }
}

تحميل ملف محلي إلى كائن ثنائي كبير الحجم

أضف الأساليب GetSourcePath و GetBlob إلى Program.cs:

public static string GetSourcePath()
{
    Console.WriteLine("\nProvide path for source:");
    string sourcePath = Console.ReadLine();

    return sourcePath;
}

public static CloudBlockBlob GetBlob(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    Console.WriteLine("\nProvide name of new Blob:");
    string blobName = Console.ReadLine();
    CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

    return blob;
}

TransferLocalFileToAzureBlob تعديل الأسلوب:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    await TransferManager.UploadAsync(localFilePath, blob);
    Console.WriteLine("\nTransfer operation complete.");
    ExecuteChoice(account);
}

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

اضغط F5 لتشغيل التطبيق الخاص بك. يمكنك التحقق من حدوث التحميل عن طريق عرض حساب التخزين الخاص بك باستخدام Microsoft Azure Storage Explorer.

تعيين عدد العمليات المتوازية

تتمثل إحدى الميزات التي توفرها مكتبة نقل البيانات في القدرة على تعيين عدد العمليات المتوازية لزيادة معدل نقل البيانات. افتراضيًا، تقوم مكتبة نقل البيانات بتعيين عدد العمليات المتوازية إلى 8 * عدد المحاور على جهازك.

ضع في اعتبارك أن العديد من العمليات المتوازية في بيئة منخفضة النطاق الترددي قد تطغى على اتصال الشبكة وتمنع بالفعل العمليات من الإكمال النهائي. ستحتاج إلى تجربة هذا الإعداد لتحديد ما هو الأفضل استنادًا إلى عرض النطاق الترددي المتاح للشبكة.

دعونا نضف بعض التعليمات البرمجية التي تسمح لنا بتعيين عدد العمليات المتوازية. دعونا نضف أيضًا رمزًا يضرب المدة التي يستغرقها إكمال النقل.

SetNumberOfParallelOperations إضافة أسلوب إلى Program.cs:

public static void SetNumberOfParallelOperations()
{
    Console.WriteLine("\nHow many parallel operations would you like to use?");
    string parallelOperations = Console.ReadLine();
    TransferManager.Configurations.ParallelOperations = int.Parse(parallelOperations);
}

ExecuteChoice تعديل الأسلوب لاستخدام SetNumberOfParallelOperations:

public static void ExecuteChoice(CloudStorageAccount account)
{
    Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
    int choice = int.Parse(Console.ReadLine());

    SetNumberOfParallelOperations();

    if(choice == 1)
    {
        TransferLocalFileToAzureBlob(account).Wait();
    }
    else if(choice == 2)
    {
        TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
    }
    else if(choice == 3)
    {
        TransferUrlToAzureBlob(account).Wait();
    }
    else if(choice == 4)
    {
        TransferAzureBlobToAzureBlob(account).Wait();
    }
}

TransferLocalFileToAzureBlob تعديل الأسلوب لاستخدام مؤقت:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

تتبع تقدم النقل

من المفيد معرفة المدة التي تستغرقها البيانات لنقلها. ومع ذلك، فإن القدرة على رؤية التقدم المحرز في النقل أثناء عملية النقل سيكون أفضل. لتحقيق هذا السيناريو، نحتاج إلى إنشاء كائن TransferContext . TransferContext يأتي الكائن في شكلين: SingleTransferContext وDirectoryTransferContext. الأول لنقل ملف واحد والثاني لنقل دليل الملفات.

أضف الأساليب GetSingleTransferContext و GetDirectoryTransferContext إلى Program.cs:

public static SingleTransferContext GetSingleTransferContext(TransferCheckpoint checkpoint)
{
    SingleTransferContext context = new SingleTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

public static DirectoryTransferContext GetDirectoryTransferContext(TransferCheckpoint checkpoint)
{
    DirectoryTransferContext context = new DirectoryTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

TransferLocalFileToAzureBlob تعديل الأسلوب لاستخدام GetSingleTransferContext:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    Console.WriteLine("\nTransfer started...\n");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob, null, context);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

استئناف التحويل الملغى

ميزة أخرى ملائمة تقدمها مكتبة نقل البيانات هي القدرة على استئناف النقل الملغى. دعونا نضيف بعض التعليمات البرمجية التي تسمح لنا بإلغاء النقل مؤقتا بكتابة c، ثم استئناف النقل بعد 3 ثوان.

تعديل TransferLocalFileToAzureBlob:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.UploadAsync(localFilePath, blob, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadAsync(localFilePath, blob, null, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

حتى الآن، تم تعيين قيمتنا checkpoint دائما إلى null. الآن، إذا ألغينا النقل، فسنسترجع آخر نقطة تفتيش لنقلنا، ثم نستخدم نقطة التفتيش الجديدة هذه في سياق النقل خاصتنا.

نقل دليل محلي إلى تخزين كائن ثنائي كبير الحجم

وسيكون من المخيب أن تتمكن مكتبة نقل البيانات من نقل ملف واحد فقط في كل مرة. لحسن الحظ، هذا ليس هو الحال. توفر مكتبة نقل البيانات القدرة على نقل دليل من الملفات وجميع الأدلة الفرعية الخاصة بها. دعونا نضف بعض التعليمات البرمجية التي تسمح لنا بالقيام بذلك.

أولا، أضف الأسلوب GetBlobDirectory إلى Program.cs:

public static CloudBlobDirectory GetBlobDirectory(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container. This can be a new or existing Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    CloudBlobDirectory blobDirectory = container.GetDirectoryReference("");

    return blobDirectory;
}

ثم قم بتعديل TransferLocalDirectoryToAzureBlobDirectory:

public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
{
    string localDirectoryPath = GetSourcePath();
    CloudBlobDirectory blobDirectory = GetBlobDirectory(account);
    TransferCheckpoint checkpoint = null;
    DirectoryTransferContext context = GetDirectoryTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    UploadDirectoryOptions options = new UploadDirectoryOptions()
    {
        Recursive = true
    };

    try
    {
        task = TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetDirectoryTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

هناك بعض الاختلافات بين هذه الطريقة وطريقة تحميل ملف واحد. نحن نستخدم الآن TransferManager.UploadDirectoryAsync والطريقة التي أنشأناها getDirectoryTransferContext سابقا. بالإضافة إلى ذلك، نقدم الآن options قيمة لعملية التحميل الخاصة بنا، ما يسمح لنا بالإشارة إلى أننا نريد تضمين الدلائل الفرعية في تحميلنا.

نسخ ملف من عنوان URL إلى كائن ثنائي كبير الحجم

الآن، دعونا نضف شفرة تسمح لنا بنسخ ملف من عنوان URL إلى Azure Blob.

تعديل TransferUrlToAzureBlob:

public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
{
    Uri uri = new Uri(GetSourcePath());
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

إحدى حالات الاستخدام المهمة لهذه الميزة هي عندما تحتاج إلى نقل البيانات من خدمة سحابية أخرى (على سبيل المثال AWS) إلى Azure. طالما أن لديك عنوان URL يمنحك حق الوصول إلى المورد، يمكنك بسهولة نقل هذا المورد إلى Azure Blobs باستخدام TransferManager.CopyAsync الأسلوب . يقدم هذا الأسلوب أيضا معلمة CopyMethod . يعرض الجدول التالي الخيارات المتوفرة لهذه المعلمة:

اسم العضو قيمة ‏‏الوصف
SyncCopy 1 قم بتنزيل البيانات من المصدر إلى الذاكرة، وتحميل البيانات من الذاكرة إلى الوجهة. متوفر حاليا فقط للنسخ من مورد Azure Storage إلى آخر.
ServiceSideAsyncCopy 1 إرسال طلب بدء النسخ إلى Azure Storage للسماح له بالقيام بالنسخ؛ مراقبة تقدم عملية النسخ حتى اكتمال النسخة.
ServiceSideSyncCopy 2 انسخ محتوى كل مجموعة باستخدام Put Block From URL أو Append Block From URL أو Put Page From URL.

نسخ كائن ثنائي كبير الحجم

ميزة أخرى توفرها مكتبة نقل البيانات بشكل فريد هي القدرة على النسخ من مورد تخزين Azure إلى آخر.

تعديل TransferAzureBlobToAzureBlob:

public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
{
    CloudBlockBlob sourceBlob = GetBlob(account);
    CloudBlockBlob destinationBlob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

في هذا المثال، قمنا بتعيين المعلمة المنطقية في TransferManager.CopyAsync للإشارة CopyMethod.SyncCopy إلى أننا نريد إجراء نسخة متزامنة. هذا يعني أنه يتم تنزيل المورد إلى جهازنا المحلي أولاً، ثم تحميله إلى Azure Blob. يعد خيار النسخ المتزامن طريقة رائعة لضمان أن عملية النسخ لديك لها سرعة ثابتة. على عكس ذلك، تعتمد سرعة النسخة غير المتزامنة من جانب الخادم على عرض النطاق الترددي للشبكة المتاح على الخادم، والذي يمكن أن يتغير. ومع ذلك، يمكن أن ينتج عن النسخ المتزامن تكلفة خروج إضافية مقارنة بالنسخة غير المتزامنة. الطريقة الموصى بها هي استخدام نسخة متزامنة في جهاز Azure VM الموجود في نفس منطقة حساب التخزين المصدر لتجنب تكلفة الخروج.

اكتمل الآن تطبيق نقل البيانات. يتوفر نموذج التعليمات البرمجية الكامل على GitHub.

الخطوات التالية

الوثائق المرجعية لمكتبة Azure Storage Data Movement.

تلميح

إدارة موارد تخزين Azure Blob مع Azure Storage Explorer. Azure Storage Explorer هو تطبيق مجاني مستقل من Microsoft يمكنك من إدارة موارد تخزين Azure Blob. باستخدام Azure Storage Explorer، يمكنك إنشاء وقراءة وتحديث وحذف حاويات البقع والبقع بصريًا، بالإضافة إلى إدارة الوصول إلى حاويات الكائنات الثنائية كبيرة الحجم والكائنات الثنائية كبيرة الحجم خاصتك.