Мне нужно было загрузить тысячи файлов и их папок в общий ресурс учетной записи хранилища Azure (файлы, а не капли).Поэтому я создал простое приложение для ПК, которое позволило бы мне выбрать папку на моем ПК (или подключенном жестком диске), нажать кнопку и вуаля!Затем файлы и каталоги были легко «клонированы» в мою папку общего доступа к файлам Azure в облаке.
Для начала вам потребуется создать новый проект в Visual Studio.Я использую VS 2017.
Шаг 1: Создайте новое приложение Windows Forms
Шаг 2: Нам нужно добавить пакет NuGet под названием WindowsAzure.Storage (v. 9.3.3), так что зайдите в Project -> Управление пакетами NuGet.Перейдите на вкладку «Обзор» и выполните поиск WindowsAzure.Storage.Затем нажмите «Установить».
Шаг 3: Добавьте новый класс в ваш проект.Затем скопируйте / вставьте следующий код, который содержит функции, необходимые для тяжелой работы по загрузке ваших файлов ...
Шаг 3a: Важно ;Обязательно замените значения «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 (форма 1) поместитеследующие элементы управления:
- TextBox1 должен быть широким текстовым полем, которое будет содержать желаемый путь.Этот путь будет «корневым» путем для всех файлов и подкаталогов
, которые будут созданы и загружены в общую папку Azure.Обратите внимание, что файлы корневой папки (если они у вас есть) НЕ будут перечислены, и, следовательно, не будут скопированы, но все его подкаталоги
, их подкаталоги и файлы будут "клонированы", загружены и скопированы.. - Поместите кнопку Button1 с надписью «Выбрать папку»
- Ниже этого поместите Button2 с надписью «Загрузить в облако»
- Ниже поместите Button3 с надписью «Отмена "
- Добавьте StatusStrip, закрепленный внизу, и поместите в него ToolStripStatusLabel с именем" tsData1 "
- Добавьте элемент управления 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) в режиме отладки.Затем
- Нажмите кнопку «Выбрать папку».fbd1, который вы добавили в качестве элемента управления folderBrowserDialog, теперь откроется и позволит вам найти папку, которую вы хотите клонировать.В этом случае вы перейдете в папку «D: \ CRM» и нажмите «ОК».TextBox1 теперь будет отображать ваш выбор папки D: \ CRM.
- Далее, нажмите кнопку «Загрузить в облако».Теперь код будет перечислять все файлы и подкаталоги в выбранной корневой папке.Однако обратите внимание, что любые фактические ФАЙЛЫ в корневом каталоге НЕ БУДУТ ПЕРЕЧИСЛЕНЫ.
- Появится окно сообщения, как только все файлы будут перечислены.Это может занять некоторое время, если у вас есть тысячи файлов и подкаталогов.Нажмите OK, и клонирование файла / каталога начнется!
- В коде включен StreamWriter, который будет создавать и записывать в файл журнала подробные сведения о каждом передаваемом файле и результате каждой передачи файла (успехили неудача).Файл журнала находится в пути запуска вашего приложения, который будет bin \ debug вашего приложения.
- Кроме того, во время передачи вы увидите обновление каждого файла # (т.е. № 35 из 512)как они обрабатываются и загружаются.Это благодаря добавленному StatusStrip / ToolStripLabel под названием tsData1.
- Нажмите кнопку Отмена, если вам нужно остановить передачу.
- Обратите внимание, что если по какой-то причине вам нужно начать все сначала,вы можете уничтожить всю файловую папку, используя портал Azure.Только будьте осторожны, чтобы не уничтожить неправильный общий доступ к файлам!Но это самый простой способ «начать заново», поскольку при использовании портала вы не можете удалить папку, если она не пуста.
- Microsoft предлагает бесплатную загрузку под названием «Microsoft Azure Storage Explorer», которая представляет собой приложение для ПК, которое очень полезно для работы с вашей учетной записью хранилища Azure.
- В разделе комментариев кода формы я упоминаюизменив " .png" на ". ", чтобы найти все файлы.Но код уже настроен на использование ". ".Однако, если вы ищете только определенное расширение, тогда замените «. » на «. [Желаемое расширение]».Затем будут перечислены только эти файлы, а не все файлы.