Выгрузка всех подкаталогов и файлов в файловую папку учетной записи хранения Azure с помощью VB.NET

Как я могу загрузить все файлы и подкаталоги в корневом каталоге на моем компьютере в общий файловый ресурс учетной записи хранения Azure (файлы, а не большие двоичные объекты)? Идея состоит в том, что я хочу эффективно «клонировать» все файлы и структуру каталогов, которые существуют на моем ПК или на жестком диске, и загрузить их на мой общий файловый ресурс Azure.

Портфолио интернет-графики Доминика Уизема


person Dominic Whitham    schedule 19.09.2019    source источник


Ответы (1)


Мне нужно было загрузить тысячи файлов и их папок в общий файловый ресурс моей учетной записи хранения Azure (файлы, а не большие двоичные объекты). Поэтому я создал простое приложение для ПК, которое позволило мне выбрать папку на моем ПК (или подключенном жестком диске), нажать кнопку и вуаля! Затем файлы и каталоги были легко «клонированы» в мое местоположение общего файлового ресурса Azure в облаке.

Для начала вам нужно создать новый проект в Visual Studio. Я использую VS 2017.

Шаг 1. Создайте новое приложение Windows Forms

Шаг 2. Нам нужно добавить пакет NuGet под названием WindowsAzure.Storage (v. 9.3.3), поэтому перейдите в Project -> Manage NuGet Packages. Щелкните вкладку Обзор и найдите WindowsAzure.Storage. Затем нажмите «Установить».

Шаг 3: Добавьте новый класс в свой проект. Затем скопируйте / вставьте следующий код, который содержит функции, необходимые для выполнения тяжелой работы по загрузке ваших файлов ...

Шаг 3а: Важно. Обязательно замените значения yourStorageAccountName и yourStorageAccountKey допустимыми значениями, представляющими вашу учетную запись хранилища файлов Azure.

Imports Microsoft.WindowsAzure.Storage
Imports System.IO
Imports Microsoft.WindowsAzure.Storage.File

Public Class AzureStorageUpload
    Private mConnectionString As String = "DefaultEndpointsProtocol=https;AccountName=yourStorageAccountName;AccountKey=yourStorageAccountKey"

    Private mUploadFileSize As Long
    Private mUploadFileExtension As String
    Private mCloudFile As CloudFile

    Public Sub UploadFileAsFileToAzureStorage(fileShare As String, folderPath As String, fullFilePath As String, originalName As String)
        'Connect to Azure
        Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(mConnectionString)

        ' Create a reference to the file client.
        Dim CloudFileClient = storageAccount.CreateCloudFileClient()
        Dim share As CloudFileShare = CloudFileClient.GetShareReference(fileShare)
        If share.Exists = True Then
            Dim rootDir As CloudFileDirectory = share.GetRootDirectoryReference()
            Dim cfd As CloudFileDirectory = share.GetRootDirectoryReference()
            cfd = cfd.GetDirectoryReference(folderPath)

            'Create a reference to the filename that you will be uploading
            mCloudFile = cfd.GetFileReference(originalName)

            'Upload the file to Azure
            mCloudFile.UploadFromFile(fullFilePath)

            mUploadFileSize = mCloudFile.Properties.Length
            mUploadFileExtension = Path.GetExtension(mCloudFile.Name)
        End If

        share = Nothing
        CloudFileClient = Nothing
        storageAccount = Nothing
    End Sub

    Public Sub CreateDirectory(fileShare As String, folder As String)
        'Connect to Azure
        Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(mConnectionString)

        ' Create a reference to the file client.
        Dim CloudFileClient = storageAccount.CreateCloudFileClient()
        Dim share As CloudFileShare = CloudFileClient.GetShareReference(fileShare)

        If share.Exists = True Then
            Dim cfd As CloudFileDirectory = share.GetRootDirectoryReference()
            cfd = cfd.GetDirectoryReference(folder)
            cfd.CreateIfNotExists()

            cfd = Nothing
        End If

        share = Nothing
        CloudFileClient = Nothing
        storageAccount = Nothing
    End Sub

    Private Function PathOnly(fileName As String) As String
        Dim l As Long

        l = InStrRev(fileName, "\")
        If l = 0 Then
            Return fileName
        Else
            Return Mid(fileName, 1, l)
        End If
    End Function

    Public Function JobOnly(ByVal MyJob As String) As String
        Dim l As Long

        JobOnly = MyJob
        l = InStrRev(JobOnly, "\")
        If l = 0 Then
            Exit Function
        End If
        JobOnly = Mid(JobOnly, l + 1, Len(JobOnly) - l)

        l = InStrRev(JobOnly, ".")
        If l = 0 Then
            Exit Function
        Else
            'Eliminate the extension
            JobOnly = Mid(JobOnly, 1, l - 1)
        End If
    End Function
End Class

Шаг 4. В форме Windows Form1 (form1) разместите следующие элементы управления:

  1. TextBox1 должен быть широким текстовым полем, которое будет содержать желаемый путь. Этот путь будет «корневым» путем для всех файлов и подкаталогов
    , которые будут созданы и загружены в общий файловый ресурс Azure. Обратите внимание, что файлы корневой папки (если они есть) НЕ будут перечислены и, следовательно, не будут скопированы, но все ее подкаталоги, их подкаталоги и файлы будут «клонированы», загружены и скопированы. .
  2. Поместите кнопку Button1 с надписью «Выбрать папку».
  3. Ниже поместите кнопку Button2 с надписью «Загрузить в облако».
  4. Ниже поместите Button3 с надписью «Отмена».
  5. Добавьте StatusStrip, закрепленный внизу, и поместите в него ToolStripStatusLabel с именем «tsData1».
  6. Добавьте элемент управления FolderBrowserDialog и назовите его «fbd1»

Шаг 5: Теперь вы готовы добавить код за формой:

Imports System.IO

Public Class Form1
    Private mWorking As Boolean

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' Select Folder/Directory to Upload
        ' Note:  The idea is that all SubDirectories and Files will be copied (cloned) to your Azure Storage FileShare (as Files, not Blobs)
        Dim DiaResult As DialogResult
        Dim batchFolder As String = "c:\"

        With fbd1
            .RootFolder = Environment.SpecialFolder.MyComputer
            .SelectedPath = batchFolder
            .Description = "Select folder to Upload to Azure Storage"
            DiaResult = .ShowDialog()
            If DiaResult <> Windows.Forms.DialogResult.OK Then
                Exit Sub
            Else
                TextBox1.Text = .SelectedPath
            End If
        End With
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim i As Integer

        WaitCursor(True)
        ' Note: Here, I'm searching for all files that have a .png extension.  If you simply want to transfer ALL files within the folders,
        ' just use *.* instead of *.png
        ' Also note that the initial directory's files are NOT enumerated (so if there are FILES in your initial chosen directory, they are NOT copied)
        Dim files = From d In Directory.EnumerateDirectories(TextBox1.Text, "*", SearchOption.AllDirectories)
                    From f In Directory.EnumerateFiles(d, "*.*")
                    Select f

        Dim txtFilesArray() As String = files.ToArray()
        WaitCursor(False)

        Dim count As Integer = 0

        Dim asu As New AzureStorageUpload

        ' Get the initial directory which has already been selected
        Dim Prefix As String = LCase(TextBox1.Text)
        Prefix = Replace(Prefix, Path.GetDirectoryName(Prefix), "")

        ' Create a log file to record the progress...
        Dim myLog As String = GetAppPath() & "\UploadLog.txt"

        ' Your file share goes here.  Be sure everything is lower case
        ' Note that your file share must already exist (use the Azure portal to create your fileshare name)
        Dim yourFileShare As String = "yourfileshare"

        Try
            ' This will create your initial directory within your file share
            ' Your intention is that you'll be uploading (cloning) everything, including subdirectories and files,
            ' that currently exist on your PC inside your "starting" folder.
            asu.CreateDirectory(yourFileShare, Prefix)
        Catch ex As Exception

        End Try

        MsgBox("Ready to begin uploading files...")

        Dim sw2 As New StreamWriter(New FileStream(myLog, FileMode.Create, FileAccess.Write))
        Dim startTime As Date = DateAndTime.Now
        sw2.WriteLine("Starting Upload at " & startTime.ToLongTimeString & " on " & startTime.ToLongDateString)

        mWorking = True

        WaitCursor(True)
        While mWorking = True
            For i = 0 To txtFilesArray.Length - 1
                Application.DoEvents()

                Dim origPath As String = txtFilesArray(i)

                If File.Exists(origPath) = True Then
                    Dim pathOnly As String = Replace(origPath, TextBox1.Text, "")
                    Dim l As Integer = InStrRev(pathOnly, "\")

                    ' Create the path - path must be all lowercase (which it is already)
                    Dim newPath As String = Mid(pathOnly, 2, l - 2)
                    If InStr(newPath, "\") = 0 Then
                        Try
                            asu.CreateDirectory(yourFileShare, Prefix & "\" & newPath)
                        Catch ex As Exception

                        End Try
                    Else
                        Dim folders() As String = Split(newPath, "\")
                        Dim j As Integer
                        Dim catPath As String = ""
                        For j = 0 To folders.Count - 1
                            If j = 0 Then
                                catPath = folders(j)
                            Else
                                catPath = catPath & "\" & folders(j)
                            End If
                            Try
                                asu.CreateDirectory(yourFileShare, Prefix & "\" & catPath)
                            Catch ex As Exception

                            End Try
                        Next
                    End If

                    newPath = Prefix & "/" & Replace(newPath, "\", "/")

                    Dim dt As Date = DateAndTime.Now
                    sw2.WriteLine("Attempting " & origPath & " at " & dt.ToLongTimeString & " on " & dt.ToShortDateString)
                    tsData1.Text = "#" & Trim(Str(i + 1)) & " of " & Trim(Str(txtFilesArray.Length))

                    Try
                        asu.UploadFileAsFileToAzureStorage(yourFileShare, newPath, origPath, asu.JobOnly(origPath) & Path.GetExtension(origPath))
                        sw2.WriteLine("Uploading ..." & origPath & "...success.")
                    Catch ex As Exception
                        sw2.WriteLine("Uploading ..." & origPath & "...failed.")
                    End Try

                    sw2.WriteLine(" ")
                End If
            Next

            mWorking = False
        End While

        sw2.Close()
        sw2.Dispose()
        sw2 = Nothing

        WaitCursor(False)

        MsgBox("Done!")
    End Sub

    Public Sub WaitCursor(ByVal ShowHourglass As Boolean)
        If ShowHourglass = True Then
            Me.Cursor = Cursors.WaitCursor
        Else
            Me.Cursor = Cursors.Default
        End If
    End Sub

    Public Function GetAppPath() As String
        'Obtain the applications's path
        GetAppPath = System.IO.Path.GetDirectoryName(Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString())

        GetAppPath = Replace(GetAppPath, "file:\", "")
    End Function

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        mWorking = False
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class

Шаг 6: запустите проект

Допустим, вы хотите клонировать все файлы и подкаталоги в «D: \ CRM». Для этого запустите проект (F5) в режиме отладки. Потом,

  1. Нажмите кнопку «Выбрать папку». fbd1, который вы добавили как элемент управления folderBrowserDialog, теперь откроется и позволит вам найти папку, которую вы хотите клонировать. В этом случае перейдите в папку «D: \ CRM» и нажмите «ОК». TextBox1 теперь отобразит выбранную вами папку D: \ CRM.
  2. Затем нажмите кнопку «Загрузить в облако». Теперь код перечислит все файлы и подкаталоги в выбранной корневой папке. Обратите внимание, однако, что любые фактические ФАЙЛЫ в корневом каталоге НЕ БУДУТ ПЕРЕЧИСЛЕННЫМ.
  3. После того, как все файлы будут пронумерованы, появится всплывающее окно. Это может занять некоторое время, если у вас тысячи файлов и подкаталогов. Нажмите OK, и начнется клонирование файла / каталога!
  4. В код включен StreamWriter, который будет создавать и записывать в файл журнала с подробным описанием каждого передаваемого файла и результатов каждой передачи (успешная или неудачная). Файл журнала находится в пути выполнения вашего приложения, который будет bin \ debug вашего приложения.
  5. Кроме того, во время передачи вы увидите обновление каждого файла № (т.е. № 35 из 512) по мере их обработки и загрузки. Это благодаря добавленному объекту StatusStrip / ToolStripLabel под названием tsData1.
  6. Нажмите кнопку «Отмена», если вам нужно остановить передачу.
  7. Обратите внимание: если по какой-то причине вам нужно начать все сначала, вы можете стереть весь файловый ресурс с помощью портала Azure. Только будьте осторожны, чтобы не стереть не тот файловый ресурс! Но это самый простой способ «начать сначала», потому что вы не можете удалить папку, если она не пуста, при использовании портала.
  8. Microsoft предлагает бесплатную загрузку под названием «Microsoft Azure Storage Explorer», приложение для ПК, которое очень полезно для работы с вашей учетной записью хранения Azure.
  9. В разделе комментариев кода формы я упоминаю об изменении «.png» на «. » для поиска всех файлов. Но код уже настроен на использование ". ". Однако, если вы ищете только конкретное расширение, замените ". " на ". [Желаемое расширение]". Затем будут перечислены только эти файлы, а не все файлы.
person Dominic Whitham    schedule 19.09.2019