Почему моя загрузка из хранилища Azure пуста? - PullRequest
0 голосов
/ 19 сентября 2019

Я могу подключиться к учетной записи хранилища Azure и даже загрузить файл, но когда я иду, чтобы загрузить файл с помощью DownloadToFileAsync (), в результате я получаю файл размером 0 КБ.

Я проверил иПоля «CloudFileDirectory» и «CloudFile» являются правильными, что означает, что соединение с Azure надежное.Я даже могу записать вывод из файла на консоль, но не могу сохранить его как файл.

public static string PullFromAzureStorage(string azureFileConn, string remoteFileName, string clientID)
        {
            var localDirectory = @"C:\cod\clients\" + clientID + @"\ftp\";
            var localFileName = clientID + "_xxx_" + remoteFileName;

            //Retrieve storage account from connection string
            var storageAccount = CloudStorageAccount.Parse(azureFileConn);
            var client = storageAccount.CreateCloudFileClient();
            var share = client.GetShareReference("testing");

            // Get a reference to the root directory for the share
            CloudFileDirectory rootDir = share.GetRootDirectoryReference();
            //Get a ref to client folder
            CloudFileDirectory cloudFileDirectory = rootDir.GetDirectoryReference(clientID);
            // Get a reference to the directory we created previously
            CloudFileDirectory unprocessed = cloudFileDirectory.GetDirectoryReference("Unprocessed");
            // Get a reference to the file
            CloudFile sourceFile = unprocessed.GetFileReference(remoteFileName);

            //write to console and log
            Console.WriteLine("Downloading file: " + remoteFileName);
            LogWriter.LogWrite("Downloading file: " + remoteFileName);

            //Console.WriteLine(sourceFile.DownloadTextAsync().Result);
            sourceFile.DownloadToFileAsync(Path.Combine(localDirectory, localFileName), FileMode.Create);

            //write to console and log
            Console.WriteLine("Download Successful!");
            LogWriter.LogWrite("Download Successful!");

            //delete remote file after download
            //sftp.DeleteFile(remoteDirectory + remoteFileName);

            return localFileName;    
        }

1 Ответ

1 голос
/ 19 сентября 2019

В закомментированной строке кода, в которую вы записываете вывод на консоль, вы явно используете .Result, потому что вы вызываете метод async в синхронном режиме.Вы также должны либо сделать это при загрузке файла, либо сделать весь метод вокруг него async.

Первое решение будет выглядеть примерно так:

sourceFile.DownloadToFileAsync(Path.Combine(localDirectory, localFileName), FileMode.Create).Result();

РЕДАКТИРОВАТЬ:
Что касается разницы с комментарием, который использует GetAwaiter().GetResult(), идет: .Result переносит все исключения, которые могут возникнуть в AggregateException, а GetAwaiter().GetResult() не будуВ любом случае: если есть возможность, вы можете изменить метод на async, чтобы использовать await: пожалуйста, сделайте это.

...