比较blob文件与c#

时间:2018-10-26 08:40:05

标签: c# azure azure-blob-storage

早期的逻辑是比较存储在Windows文件夹位置的文件。请查看下面的代码,以比较两个基于字节的文件

const int BYTES_TO_READ = 1024;

public static bool filesAreDifferent(string file1, string file2) {
    FileInfo fi1 = new FileInfo(file1);
    FileInfo fi2 = new FileInfo(file2);

    if (!fi1.Exists || !fi2.Exists) return true;
    if (fi1.Length != fi2.Length) return true;

    int iterations = (int)Math.Ceiling((double)fi1.Length / BYTES_TO_READ);

    using (FileStream fs1 = fi1.OpenRead())
    using (FileStream fs2 = fi2.OpenRead()) {
        byte[] one = new byte[BYTES_TO_READ];
        byte[] two = new byte[BYTES_TO_READ];

        for (int i = 0; i < iterations; i++) {
            fs1.Read(one, 0, BYTES_TO_READ);
            fs2.Read(two, 0, BYTES_TO_READ);
           if (!one.SequenceEqual(two)) return true;            
        }
    }

    return false;
}

现在我要比较存储在blob容器中的2个文件。 下面是我到目前为止尝试过的(调整了旧的逻辑),

public static CloudBlobContainer GetStorageAccount(bool IsCreateIfNotExists)
{
    var ff = ConfigurationManager.AppSettings["AzureWebJobsStorage"];
    string configvalue1 = ConfigurationManager.AppSettings["AzureWebJobsStorage"];
    string configvalue2 = ConfigurationManager.AppSettings["AzureWebJobsStorage"];

    CloudBlobContainer blob = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["AzureWebJobsStorage"])
                       .CreateCloudBlobClient()
                       .GetContainerReference(ConfigurationManager.AppSettings["BlobCotainer"]);

    if(IsCreateIfNotExists)
       blob.CreateIfNotExistsAsync();

    return blob;

}

public static bool filesAreDifferentBlob(string file1, string file2)
{
    CloudBlockBlob fil1 = GetStorageAccount(true).GetBlockBlobReference(file1);
    CloudBlockBlob fil2 = GetStorageAccount(true).GetBlockBlobReference(file2);
    fil1.FetchAttributes();
    fil2.FetchAttributes();

    if (!fil1.Exists() || !fil2.Exists()) return true;
    if (fil1.Properties.Length != fil1.Properties.Length) return true;

    int iterations = (int)Math.Ceiling((double)fil1.Properties.Length / BYTES_TO_READ);
    using (StreamReader fsf1 = new StreamReader(fil1.OpenRead()))
    using (StreamReader fsf2 = new StreamReader(fil2.OpenRead()))
    {
       byte[] one = new byte[BYTES_TO_READ];
       byte[] two = new byte[BYTES_TO_READ];

       for (int i = 0; i < iterations; i++)
       {
         fsf1.Read(one, 0, BYTES_TO_READ);
         fsf2.Read(two, 0, BYTES_TO_READ);
         if (!one.SequenceEqual(two)) return true;
        }
    }
    return false;
}

但是我收到错误消息“无法从byte []转换为char []”。 有什么方法可以将blob中的2个文件进行比较吗?

1 个答案:

答案 0 :(得分:2)

  

有什么方法可以将blob中的两个文件进行比较吗?

正如Thomas所提到的,我们可以比较blob的ContentMD5哈希,而不是比较所有字节。我们可以轻松获取ContentMD5个哈希值。

fil1.FetchAttributes();
fil2.FetchAttributes();
if (!fil1.Exists() || !fil2.Exists()) return true;
if (fil1.Properties.ContentMD5!= fil2.Properties.ContentMD5) return true;
return false;