Подсчет хэшей всех файлов на диске С - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Пытаюсь вывести список всех файлов на компе с их MD5 хэшом, при подсчете хэша выскакивала ошибка "Процесс не может получить доступ к файлу, так как этот файл используется другим процессом", я попробовал поставить блок try{} catch(IOException){}, но теперь выводится лишь малая часть файлов. Подскажите пожалуйста, как это можно сделать.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ComponentModel;
  6. using System.Threading.Tasks;
  7. using System.IO;
  8. using System.Security.Cryptography;
  9. using System.IO.Compression;
  10. using Ionic.Zip;
  11. using System.Threading;
  12.  
  13. namespace Md5_test1
  14. {
  15. class Program
  16. {
  17. private static string ComputeMD5Checksum(string path)
  18. {
  19. using (FileStream fs = System.IO.File.OpenRead(path))
  20. using (MD5 md5 = new MD5CryptoServiceProvider())
  21. {
  22. byte[] checkSum = md5.ComputeHash(fs);
  23. string result = BitConverter.ToString(checkSum).Replace("-", String.Empty);
  24. return result;
  25. }
  26. }
  27.  
  28. static void Main(string[] args)
  29. {
  30. string logFile = (@"C:" + System.Net.Dns.GetHostName() + ".txt");
  31. try
  32. {
  33. var filesname = from file in Directory.EnumerateFiles(@"C:", "*.*", SearchOption.AllDirectories)
  34. select new
  35. {
  36. File = file,
  37. };
  38. foreach (var f in filesname)
  39. {
  40. try
  41. {
  42. File.AppendAllText(logFile, DateTime.Now.ToString("yyyy-MM-dd") + "||" + System.Net.Dns.GetHostName() + "||" + ComputeMD5Checksum(f.File) + "||" + Path.GetFileName(f.File) + "||" + f.File + "||" + GetSizeInString(FileSize(f.File)) + Environment.NewLine, Encoding.UTF8);
  43. }
  44. catch (IOException)
  45. {
  46. }
  47. }
  48. }
  49. catch (UnauthorizedAccessException)
  50. {
  51. }
  52. catch (PathTooLongException)
  53. {
  54. }
  55. }
  56.  
  57. //Определение размера файла
  58. private static long FileSize(string path)
  59. {
  60. //long Size = 0;
  61. System.IO.FileInfo file = new System.IO.FileInfo(path);
  62. long size = file.Length;
  63. return (size);
  64. }
  65. //Привидение размера к килобайтам
  66. private static string GetSizeInString(long size)
  67. {
  68. double temp = (double)size;
  69. temp /= (1024);
  70. return String.Format("{0:F}", temp) ;
  71. }
  72. }
  73. }

Решение задачи: «Подсчет хэшей всех файлов на диске С»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Reflection;
  5. using System.Text;
  6.  
  7. namespace Md5_test1
  8. {
  9.     class Program
  10.     {
  11.         private static List<string> mResult;
  12.  
  13.         static void Main(string[] args)
  14.         {
  15.             DriveInfo di = new DriveInfo("C");
  16.             mResult = new List<string>();
  17.  
  18.             ScanDirectorty(di.RootDirectory);
  19.  
  20.             string logFile = Path.Combine(GetExeDirectory(), "log.txt");
  21.  
  22.             using (var stream = new StreamWriter(logFile, false, Encoding.UTF8))
  23.             {
  24.                 foreach (var item in mResult)
  25.                 {
  26.                     stream.WriteLine(item);
  27.                 }
  28.             }
  29.         }
  30.  
  31.         private static void ScanDirectorty(DirectoryInfo di)
  32.         {
  33.             try
  34.             {
  35.                 foreach (var item in di.EnumerateFiles())
  36.                 {
  37.                     ScanFile(item);
  38.                 }
  39.  
  40.                 foreach (var item in di.EnumerateDirectories())
  41.                 {
  42.                     ScanDirectorty(item);
  43.                 }
  44.             }
  45.             catch (UnauthorizedAccessException)
  46.             {
  47.                 mResult.Add(String.Format(
  48.                     "Access denied to \t {0}",
  49.                     di.FullName));
  50.             }
  51.         }
  52.  
  53.         private static void ScanFile(FileInfo fi)
  54.         {
  55.             try
  56.             {
  57.                 mResult.Add(String.Format(
  58.                     "{0}\t{1}",
  59.                     fi.FullName,
  60.                     fi.Length));
  61.             }
  62.             catch (UnauthorizedAccessException)
  63.             {
  64.                 mResult.Add(String.Format(
  65.                     "Access denied to \t {0}",
  66.                     fi.FullName));
  67.             }
  68.         }
  69.  
  70.         private static string GetExeDirectory()
  71.         {
  72.             string codeBase = Assembly.GetExecutingAssembly().CodeBase;
  73.             UriBuilder uri = new UriBuilder(codeBase);
  74.             string path = Uri.UnescapeDataString(uri.Path);
  75.             path = Path.GetDirectoryName(path);
  76.             return path;
  77.         }
  78.     }
  79. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы