public long DownloadBlob(string containerName, string blobName, string localFilePath, int parallelFactor = 2)
{
long bytesDownloaded = 0;
if (CommonOps.DoesFileExist(localFilePath))
{
// local file exists.
// 1) generate sig for local file.
// 2) download sig for blob.
var blobSig = DownloadSignatureForBlob(containerName, blobName);
var localSig = CommonOps.CreateSignatureForLocalFile(localFilePath);
var searchResults = CommonOps.SearchLocalFileForSignatures(localFilePath, blobSig);
// we now have a list of which blocks are already in the local file (searchResults.SignaturesToReuse)
// We need to then determine the byteranges which are NOT covered by these blocks
// and download those.
// Then we need to get the blocks that already exist in the local file, read those then write them to the new file.
var byteRangesToDownload = GenerateByteRangesOfBlobToDownload(searchResults.SignaturesToReuse, blobSig,
containerName, blobName);
RegenerateBlob(containerName, blobName, byteRangesToDownload, localFilePath, searchResults.SignaturesToReuse, blobSig, parallelFactor);
foreach (var byteRange in byteRangesToDownload)
{
bytesDownloaded += byteRange.EndOffset - byteRange.BeginOffset;
}
}
else
{
// download fresh copy.
// get stream to store.
using (var stream = CommonHelper.GetStream(localFilePath))
{
bytesDownloaded = DownloadBlob(containerName, blobName, stream, parallelFactor);
}
}
return(bytesDownloaded);
}