ckozma
ckozma

Reputation: 49

Why is my download from Azure storage empty?

I can connect to the Azure Storage account and can even upload a file, but when I go to download the file using DownloadToFileAsync() I get a 0kb file as a result.

I have checked and the "CloudFileDirectory" and the "CloudFile" fields are all correct, which means the connection with Azure is solid. I can even write the output from the file to the console, but I cannot seem to save it as a file.

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;    
        }

Upvotes: 2

Views: 976

Answers (1)

rickvdbosch
rickvdbosch

Reputation: 15571

In the commented out line of code where you write the output to the Console, you explicitly use .Result because you're calling an async method in a synchronous one. You should either also do so while downloading the file as well, or make the entire method around it async.

The first solution would look something like this:

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

EDIT:
As far as the difference with the comment, that uses GetAwaiter().GetResult(), goes: .Result wraps any exception that might occur in an AggregateException, while GetAwaiter().GetResult() won't. Anyhow: if there's any possibility you can refactor the method to be async so you can use await: please do so.

Upvotes: 1

Related Questions