نقل البيانات باستخدام 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. في هذه المرحلة، يجب أن ترى مطالبتين. أحدهما هو إضافة "الأصول المطلوبة للبناء والتصحيح". حدد "نعم". مطالبة أخرى لاستعادة التبعيات التي لم يتم حلها. حدد "restore".
  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. يجب عرض مطالبة لاستعادة مشروعك. حدد الزر "restore". يمكنك أيضا استعادة المشروع من سطر الأوامر عن طريق كتابة الأمر 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);
}

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

ميزة أخرى تقدمها مكتبة Data Movement هي القدرة على استئناف النقل الذي تم إلغاؤه. بعد ذلك، نضيف بعض التعليمات البرمجية التي تسمح لنا بإلغاء النقل مؤقتا بكتابة 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. الآن، إذا ألغينا النقل، فسنسترجع آخر نقطة تفتيش لنقلنا، ثم نستخدم نقطة التفتيش الجديدة هذه في سياق النقل خاصتنا.

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

تسمح لك مكتبة Data Movement بنقل دليل من الملفات وجميع الدلائل الفرعية الخاصة بها، كما هو موضح في المثال التالي.

أولا، أضف الأسلوب 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);
}

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

اسم العضو قيمة ‏‏الوصف
SyncCopy 0 قم بتنزيل البيانات من المصدر إلى الذاكرة، وتحميل البيانات من الذاكرة إلى الوجهة. متوفر حاليا فقط للنسخ من مورد 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 الظاهري الموجود في نفس المنطقة مثل حساب التخزين المصدر لتجنب تكلفة الخروج.

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

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

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

تلميح

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