2 /* -----------------------------------------------------------------------
3 * <copyright file="BlockExtensions.cs" company="GRNet">
5 * Copyright 2011-2012 GRNET S.A. All rights reserved.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * 1. Redistributions of source code must retain the above
12 * copyright notice, this list of conditions and the following
15 * 2. Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials
18 * provided with the distribution.
21 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
22 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
28 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 * POSSIBILITY OF SUCH DAMAGE.
34 * The views and conclusions contained in the software and
35 * documentation are those of the authors and should not be
36 * interpreted as representing official policies, either expressed
37 * or implied, of GRNET S.A.
39 * -----------------------------------------------------------------------
43 using System.Collections.Generic;
44 using System.Diagnostics.Contracts;
46 using System.Reflection;
47 using System.Security.Cryptography;
50 using System.Text.RegularExpressions;
51 using System.Threading.Tasks;
55 namespace Pithos.Core.Agents
57 static class BlockExtensions
60 private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
62 public static int Read(this FileInfo fileInfo,byte[] buffer,long offset,int count)
65 throw new ArgumentOutOfRangeException("offset", offset, "The file offset can't be negative");
66 Contract.EndContractBlock();
67 //Open the stream only long enough to read a block
68 using (var stream = fileInfo.OpenRead())
70 stream.Seek(offset, SeekOrigin.Begin);
71 return stream.Read(buffer, 0, count);
75 public static string CalculateHash(this FileSystemInfo info,int blockSize,string algorithm)
78 throw new ArgumentNullException("info");
79 if (String.IsNullOrWhiteSpace(info.FullName))
80 throw new ArgumentException("info");
82 throw new ArgumentOutOfRangeException("blockSize",blockSize,"blockSize must be greater than 0");
83 if (String.IsNullOrWhiteSpace(algorithm))
84 throw new ArgumentNullException("algorithm");
85 Contract.EndContractBlock();
87 //The hash for directories is an empty string
88 if (info is DirectoryInfo)
90 //The hash for non-existent files is an empty string
94 return Signature.CalculateTreeHash(info.FullName, blockSize, algorithm).TopHash.ToHashString();
99 ///Calculates a simple hash for an entire file
101 /// <param name="info">The file to hash</param>
102 /// <param name="hasher">The hash algorithm to use</param>
103 /// <returns>A hash value for the entire file. An empty string if the file does not exist.</returns>
104 public static string ComputeShortHash(this FileInfo info, HashAlgorithm hasher)
107 throw new ArgumentNullException("info");
109 throw new ArgumentNullException("hasher");
110 Contract.EndContractBlock();
115 if (Log.IsDebugEnabled)
116 Log.DebugFormat("Short Hashing [{0}] ",info.FullName);
118 using (var stream = info.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
120 var hash = hasher.ComputeHash(stream);
121 var hashString = hash.ToHashString();
126 public static string ComputeShortHash(this FileInfo info)
129 throw new ArgumentNullException("info");
130 Contract.EndContractBlock();
132 using (var hasher=HashAlgorithm.Create("sha1"))
134 return ComputeShortHash(info,hasher);