Получение информации о сетевой папке - C#

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

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

Здравствуйте, подскажите пожалуйста, хочу написать небольшую службу, которая будет вести логи на сервере, в которых будет указаны: дата создания лога, размер и дата модификации указанной директории, а также ее путь. Для папок, находящихся на компе все работает прекрасно. Например: E:\Programs\Mathcad Однако если я указываю сетевую папку, например: \\hub\Programs\VS То в файле логов Logs. txt не появляется никакой информации, однако в файле Info.txt данная директория добавляется
Листинг программы
  1. private static System.Timers.Timer aTimer;
  2. public static List<string> paths = new List<string>();
  3. public Logger()
  4. {
  5. SetTimer();
  6. string pathText = @"E:\Logs.txt";
  7. string infoText = @"E:\Info.txt";
  8. if (File.Exists(infoText))
  9. {
  10. string[] readInfo = System.IO.File.ReadAllLines(infoText);
  11. for (int i = 0; i < readInfo.Length; i++)
  12. {
  13. if (readInfo[i].Contains("\\"))
  14. {
  15. paths.Add(readInfo[i]);
  16. }
  17. else
  18. {
  19. continue;
  20. }
  21. }
  22. }
  23. // Если файла нет, создает файл Info.txt и заполняет его
  24. if (!File.Exists(infoText))
  25. {
  26. string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine;
  27. File.AppendAllText(infoText, appendInfo, Encoding.UTF8);
  28. foreach (string text in paths)
  29. {
  30. File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8);
  31. }
  32. string info = "===============Информация====================" + Environment.NewLine +
  33. "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine +
  34. "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine +
  35. Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine;
  36. File.AppendAllText(infoText, info, Encoding.UTF8);
  37. }
  38. // Если файла нет, создает файл Logs.txt и заполняет его
  39. if (!File.Exists(pathText))
  40. {
  41. File.AppendAllText(pathText, "", Encoding.UTF8);
  42. foreach (string text in paths)
  43. {
  44. try
  45. {
  46. DateTime localDate = DateTime.Now;
  47. DateTime dt = Directory.GetLastWriteTime(text);
  48. DirectoryInfo di = new DirectoryInfo(text);
  49. string appendText = localDate.ToString() + " | " + text
  50. + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine;
  51. File.AppendAllText(pathText, appendText, Encoding.UTF8);
  52. }
  53. catch(IOException)
  54. {
  55. ;
  56. }
  57. }
  58. }
  59. }
  60.  
  61. // Задаём настройки таймера.
  62. private static void SetTimer()
  63. {
  64. aTimer = new System.Timers.Timer(120000);
  65. aTimer.Elapsed += OnTimedEvent;
  66. aTimer.AutoReset = true;
  67. aTimer.Enabled = true;
  68. }
  69.  
  70. private static void OnTimedEvent(Object source, ElapsedEventArgs e)
  71. {
  72. string pathText = @"E:\Logs.txt";
  73. string infoText = @"E:\Info.txt";
  74. //Считываем текст из файла Info.txt и обрабатываем если появились новые команды
  75. string[] readInfo = System.IO.File.ReadAllLines(infoText);
  76. for (int i = 0; i < readInfo.Length; i++)
  77. {
  78. if (readInfo[i].Contains("add "))
  79. {
  80. if (!(paths.Contains(readInfo[i].Substring(4))))
  81. {
  82. paths.Add(readInfo[i].Substring(4));
  83. }
  84. else
  85. {
  86. continue;
  87. }
  88. }
  89. if (readInfo[i].Contains("delete "))
  90. {
  91. if (paths.Contains(readInfo[i].Substring(7)))
  92. {
  93. paths.Remove(readInfo[i].Substring(7));
  94. }
  95. }
  96. else
  97. {
  98. continue;
  99. }
  100. }
  101. //Перезапись файла Info.txt
  102. string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine;
  103. File.WriteAllText(infoText, appendInfo, Encoding.UTF8);
  104. foreach (string text in paths)
  105. {
  106. File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8);
  107. }
  108. string info = "===============Информация====================" + Environment.NewLine +
  109. "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine +
  110. "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine +
  111. Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine;
  112. File.AppendAllText(infoText, info, Encoding.UTF8);
  113. // Запись в файл Logs.txt
  114. foreach (string text in paths)
  115. {
  116. try
  117. {
  118. DateTime localDate = DateTime.Now;
  119. DateTime dt = Directory.GetLastWriteTime(text);
  120. DirectoryInfo di = new DirectoryInfo(text);
  121. string appendText = localDate.ToString() + " | " + text
  122. + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine;
  123. File.AppendAllText(pathText, appendText, Encoding.UTF8);
  124. }
  125. catch (IOException)
  126. {
  127. ;
  128. }
  129. }
  130. //удаление записей сделанных неделю назад, если таймер срабатывает каждые 2 часа
  131. string[] readText = System.IO.File.ReadAllLines(pathText);
  132. if (readText.Length > (7 * 12 * paths.Count))
  133. {
  134. using (System.IO.StreamWriter file = new System.IO.StreamWriter(pathText, false))
  135. {
  136. for (int i = 0; i < readText.Length; i++)
  137. {
  138. if (i > (paths.Count - 1))
  139. file.WriteLine(readText[i]);
  140. }
  141. }
  142. }
  143. }

Решение задачи: «Получение информации о сетевой папке»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.IO;
  6. using System.ServiceProcess;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Timers;
  10.  
  11. namespace WatchSizeFiles
  12. {
  13.     public partial class Service1 : ServiceBase
  14.     {
  15.         Logger logger = new Logger();
  16.         public Service1()
  17.         {
  18.             InitializeComponent();
  19.             this.CanStop = true;
  20.             this.CanPauseAndContinue = true;
  21.             this.AutoLog = true;
  22.         }
  23.  
  24.         protected override void OnStart(string[] args)
  25.         {
  26.            
  27.             Thread loggerThread = new Thread(new ThreadStart(logger.Start));
  28.             loggerThread.Start();
  29.         }
  30.  
  31.         protected override void OnStop()
  32.         {
  33.             logger.Stop();
  34.             Thread.Sleep(1000);
  35.             //Environment.Exit(0);
  36.         }
  37.     }
  38.  
  39.     class Logger
  40.     {
  41.         object obj = new object();
  42.         private bool enabled = true;
  43.         private static System.Timers.Timer aTimer;
  44.         public static List<string> paths = new List<string>();
  45.  
  46.         public Logger()
  47.         {
  48.             SetTimer();
  49.             string pathText = @"E:\Logs.txt";
  50.             string infoText = @"E:\Info.txt";
  51.            
  52.             if (File.Exists(infoText))
  53.             {
  54.                 string[] readInfo = System.IO.File.ReadAllLines(infoText);
  55.                 for (int i = 0; i < readInfo.Length; i++)
  56.                 {
  57.                     if (readInfo[i].Contains("\\"))
  58.                     {
  59.                         paths.Add(@"" + readInfo[i]);
  60.                     }
  61.                     else
  62.                     {
  63.                         continue;
  64.                     }
  65.                 }
  66.             }
  67.             // Если файла нет, создает файл Info.txt и заполняет его
  68.             if (!File.Exists(infoText))
  69.             {
  70.                 string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine;
  71.                 File.AppendAllText(infoText, appendInfo, Encoding.UTF8);
  72.                 foreach (string text in paths)
  73.                 {
  74.                     File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8);
  75.                 }
  76.                 string info = "===============Информация====================" + Environment.NewLine +
  77.                     "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine +
  78.                     "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine +
  79.                     Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine;
  80.                 File.AppendAllText(infoText, info, Encoding.UTF8);
  81.             }
  82.             // Если файла нет, создает файл Logs.txt и заполняет его
  83.             if (!File.Exists(pathText))
  84.             {
  85.                 File.AppendAllText(pathText, "", Encoding.UTF8);
  86.                 foreach (string text in paths)
  87.                 {
  88.                     try
  89.                     {
  90.                         DateTime localDate = DateTime.Now;
  91.                         DateTime dt = Directory.GetLastWriteTime(text);
  92.                         DirectoryInfo di = new DirectoryInfo(text);
  93.                         string appendText = localDate.ToString() + " | " + text
  94.                             + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine;
  95.                         File.AppendAllText(pathText, appendText, Encoding.UTF8);
  96.                     }
  97.                     catch(IOException)
  98.                     {
  99.                         ;
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.  
  105.         public void Start()
  106.         {
  107.            
  108.             while (enabled == true)
  109.             {
  110.                 Thread.Sleep(1000);
  111.             }
  112.         }
  113.  
  114.         public void Stop()
  115.         {
  116.             aTimer.Enabled = false;
  117.             aTimer.Stop();
  118.             enabled = false;
  119.             //Environment.Exit(0);
  120.         }
  121.  
  122.         // Задаём настройки таймера.
  123.         private static void SetTimer()
  124.         {
  125.             aTimer = new System.Timers.Timer(120000);
  126.             aTimer.Elapsed += OnTimedEvent;
  127.             aTimer.AutoReset = true;
  128.             aTimer.Enabled = true;
  129.  
  130.         }
  131.  
  132.        
  133.         private static void OnTimedEvent(Object source, ElapsedEventArgs e)
  134.         {
  135.  
  136.             string pathText = @"E:\Logs.txt";
  137.             string infoText = @"E:\Info.txt";
  138.             //Считывваем текст из файла Info.txt и обрабатываем если появились новые команды
  139.             string[] readInfo = System.IO.File.ReadAllLines(infoText);
  140.             for (int i = 0; i < readInfo.Length; i++)
  141.             {
  142.                 if (readInfo[i].Contains("add "))
  143.                 {
  144.                     if (!(paths.Contains(@"" + readInfo[i].Substring(4))))
  145.                     {
  146.                         paths.Add(@"" + readInfo[i].Substring(4));
  147.                     }
  148.                     else
  149.                     {
  150.                         continue;
  151.                     }
  152.                 }
  153.                 if (readInfo[i].Contains("delete "))
  154.                 {
  155.                     if (paths.Contains(@"" + readInfo[i].Substring(7)))
  156.                     {
  157.                         paths.Remove(@"" + readInfo[i].Substring(7));
  158.                     }
  159.                 }
  160.                 else
  161.                 {
  162.                     continue;
  163.                 }
  164.             }
  165.             //Перезапись файла Info.txt
  166.             string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine;
  167.             File.WriteAllText(infoText, appendInfo, Encoding.UTF8);
  168.             foreach (string text in paths)
  169.             {
  170.                 File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8);
  171.             }
  172.             string info = "===============Информация====================" + Environment.NewLine +
  173.                 "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine +
  174.                 "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine +
  175.                 Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine;
  176.             File.AppendAllText(infoText, info, Encoding.UTF8);
  177.  
  178.             // Запись в файл Logs.txt
  179.             foreach (string text in paths)
  180.             {
  181.                 try
  182.                 {
  183.                     DateTime localDate = DateTime.Now;
  184.                     DateTime dt = Directory.GetLastWriteTime(text);
  185.                     DirectoryInfo di = new DirectoryInfo(text);
  186.                     string appendText = localDate.ToString() + " | " + text
  187.                         + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine;
  188.                     File.AppendAllText(pathText, appendText, Encoding.UTF8);
  189.                 }
  190.                 catch (IOException)
  191.                 {
  192.                     ;
  193.                 }
  194.             }
  195.  
  196.             //удаление записей сделанных неделю назад, если таймер срабатывает каждые 2 часа
  197.             string[] readText = System.IO.File.ReadAllLines(pathText);
  198.             if (readText.Length > (7 * 12 * paths.Count))
  199.             {
  200.                 using (System.IO.StreamWriter file = new System.IO.StreamWriter(pathText, false))
  201.                 {
  202.                     for (int i = 0; i < readText.Length; i++)
  203.                     {
  204.                         if (i > (paths.Count - 1))
  205.                             file.WriteLine(readText[i]);
  206.                     }
  207.                 }
  208.             }
  209.         }
  210.  
  211.         // Вычисляем размер заданной директории
  212.         private static long DirSize(DirectoryInfo d)
  213.         {
  214.             long Size = 0;
  215.             // Add file sizes.
  216.             FileInfo[] fis = d.GetFiles();
  217.             foreach (FileInfo fi in fis)
  218.             {
  219.                 try
  220.                 {
  221.                     Size += fi.Length;
  222.                 }
  223.                 //Данное исключение делается для пропуска папок к которым нет доступа
  224.                 catch (UnauthorizedAccessException)
  225.                 {
  226.                     ;
  227.                 }
  228.             }
  229.             // Размер поддиректорий.
  230.             DirectoryInfo[] dis = d.GetDirectories();
  231.             foreach (DirectoryInfo di in dis)
  232.             {
  233.                 try
  234.                 {
  235.                     Size += DirSize(di);
  236.                 }
  237.                 //Данное исключение делается для пропуска папок к которым нет доступа
  238.                 catch (UnauthorizedAccessException)
  239.                 {
  240.                     ;
  241.                 }
  242.             }
  243.             return (Size);
  244.         }
  245.  
  246.         // Преобразем размер в мегабайты
  247.         private static string GetSizeInString(long size)
  248.         {
  249.             string postfix = "Mb";
  250.             double temp = (double)size;
  251.             temp /= (1024 * 1024);
  252.             return String.Format("{0:F}", temp) + " " + postfix;
  253.         }
  254.     }
  255. }

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


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

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

11   голосов , оценка 3.727 из 5

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

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

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