Получение информации о сетевой папке - C#
Формулировка задачи:
Здравствуйте, подскажите пожалуйста, хочу написать небольшую службу, которая будет вести логи на сервере, в которых будет указаны: дата создания лога, размер и дата модификации указанной директории, а также ее путь. Для папок, находящихся на компе все работает прекрасно. Например:
E:\Programs\Mathcad
Однако если я указываю сетевую папку, например:
\\hub\Programs\VS
То в файле логов Logs. txt не появляется никакой информации, однако в файле Info.txt данная директория добавляется
private static System.Timers.Timer aTimer; public static List<string> paths = new List<string>(); public Logger() { SetTimer(); string pathText = @"E:\Logs.txt"; string infoText = @"E:\Info.txt"; if (File.Exists(infoText)) { string[] readInfo = System.IO.File.ReadAllLines(infoText); for (int i = 0; i < readInfo.Length; i++) { if (readInfo[i].Contains("\\")) { paths.Add(readInfo[i]); } else { continue; } } } // Если файла нет, создает файл Info.txt и заполняет его if (!File.Exists(infoText)) { string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine; File.AppendAllText(infoText, appendInfo, Encoding.UTF8); foreach (string text in paths) { File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8); } string info = "===============Информация====================" + Environment.NewLine + "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine + "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine + Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine; File.AppendAllText(infoText, info, Encoding.UTF8); } // Если файла нет, создает файл Logs.txt и заполняет его if (!File.Exists(pathText)) { File.AppendAllText(pathText, "", Encoding.UTF8); foreach (string text in paths) { try { DateTime localDate = DateTime.Now; DateTime dt = Directory.GetLastWriteTime(text); DirectoryInfo di = new DirectoryInfo(text); string appendText = localDate.ToString() + " | " + text + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine; File.AppendAllText(pathText, appendText, Encoding.UTF8); } catch(IOException) { ; } } } } // Задаём настройки таймера. private static void SetTimer() { aTimer = new System.Timers.Timer(120000); aTimer.Elapsed += OnTimedEvent; aTimer.AutoReset = true; aTimer.Enabled = true; } private static void OnTimedEvent(Object source, ElapsedEventArgs e) { string pathText = @"E:\Logs.txt"; string infoText = @"E:\Info.txt"; //Считываем текст из файла Info.txt и обрабатываем если появились новые команды string[] readInfo = System.IO.File.ReadAllLines(infoText); for (int i = 0; i < readInfo.Length; i++) { if (readInfo[i].Contains("add ")) { if (!(paths.Contains(readInfo[i].Substring(4)))) { paths.Add(readInfo[i].Substring(4)); } else { continue; } } if (readInfo[i].Contains("delete ")) { if (paths.Contains(readInfo[i].Substring(7))) { paths.Remove(readInfo[i].Substring(7)); } } else { continue; } } //Перезапись файла Info.txt string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine; File.WriteAllText(infoText, appendInfo, Encoding.UTF8); foreach (string text in paths) { File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8); } string info = "===============Информация====================" + Environment.NewLine + "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine + "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine + Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine; File.AppendAllText(infoText, info, Encoding.UTF8); // Запись в файл Logs.txt foreach (string text in paths) { try { DateTime localDate = DateTime.Now; DateTime dt = Directory.GetLastWriteTime(text); DirectoryInfo di = new DirectoryInfo(text); string appendText = localDate.ToString() + " | " + text + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine; File.AppendAllText(pathText, appendText, Encoding.UTF8); } catch (IOException) { ; } } //удаление записей сделанных неделю назад, если таймер срабатывает каждые 2 часа string[] readText = System.IO.File.ReadAllLines(pathText); if (readText.Length > (7 * 12 * paths.Count)) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(pathText, false)) { for (int i = 0; i < readText.Length; i++) { if (i > (paths.Count - 1)) file.WriteLine(readText[i]); } } } }
Решение задачи: «Получение информации о сетевой папке»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.IO; using System.ServiceProcess; using System.Text; using System.Threading; using System.Timers; namespace WatchSizeFiles { public partial class Service1 : ServiceBase { Logger logger = new Logger(); public Service1() { InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; } protected override void OnStart(string[] args) { Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); } protected override void OnStop() { logger.Stop(); Thread.Sleep(1000); //Environment.Exit(0); } } class Logger { object obj = new object(); private bool enabled = true; private static System.Timers.Timer aTimer; public static List<string> paths = new List<string>(); public Logger() { SetTimer(); string pathText = @"E:\Logs.txt"; string infoText = @"E:\Info.txt"; if (File.Exists(infoText)) { string[] readInfo = System.IO.File.ReadAllLines(infoText); for (int i = 0; i < readInfo.Length; i++) { if (readInfo[i].Contains("\\")) { paths.Add(@"" + readInfo[i]); } else { continue; } } } // Если файла нет, создает файл Info.txt и заполняет его if (!File.Exists(infoText)) { string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine; File.AppendAllText(infoText, appendInfo, Encoding.UTF8); foreach (string text in paths) { File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8); } string info = "===============Информация====================" + Environment.NewLine + "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine + "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine + Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine; File.AppendAllText(infoText, info, Encoding.UTF8); } // Если файла нет, создает файл Logs.txt и заполняет его if (!File.Exists(pathText)) { File.AppendAllText(pathText, "", Encoding.UTF8); foreach (string text in paths) { try { DateTime localDate = DateTime.Now; DateTime dt = Directory.GetLastWriteTime(text); DirectoryInfo di = new DirectoryInfo(text); string appendText = localDate.ToString() + " | " + text + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine; File.AppendAllText(pathText, appendText, Encoding.UTF8); } catch(IOException) { ; } } } } public void Start() { while (enabled == true) { Thread.Sleep(1000); } } public void Stop() { aTimer.Enabled = false; aTimer.Stop(); enabled = false; //Environment.Exit(0); } // Задаём настройки таймера. private static void SetTimer() { aTimer = new System.Timers.Timer(120000); aTimer.Elapsed += OnTimedEvent; aTimer.AutoReset = true; aTimer.Enabled = true; } private static void OnTimedEvent(Object source, ElapsedEventArgs e) { string pathText = @"E:\Logs.txt"; string infoText = @"E:\Info.txt"; //Считывваем текст из файла Info.txt и обрабатываем если появились новые команды string[] readInfo = System.IO.File.ReadAllLines(infoText); for (int i = 0; i < readInfo.Length; i++) { if (readInfo[i].Contains("add ")) { if (!(paths.Contains(@"" + readInfo[i].Substring(4)))) { paths.Add(@"" + readInfo[i].Substring(4)); } else { continue; } } if (readInfo[i].Contains("delete ")) { if (paths.Contains(@"" + readInfo[i].Substring(7))) { paths.Remove(@"" + readInfo[i].Substring(7)); } } else { continue; } } //Перезапись файла Info.txt string appendInfo = "Текущие директории:" + Environment.NewLine + Environment.NewLine; File.WriteAllText(infoText, appendInfo, Encoding.UTF8); foreach (string text in paths) { File.AppendAllText(infoText, text + Environment.NewLine, Encoding.UTF8); } string info = "===============Информация====================" + Environment.NewLine + "Для добавления директории введите "add" и после пробела саму директорию" + Environment.NewLine + "Для удаления директории введите "delete" и после пробела директорию указанную в разделе "Текущие директории"" + Environment.NewLine + Environment.NewLine + "================Вводите действие и директорию================" + Environment.NewLine; File.AppendAllText(infoText, info, Encoding.UTF8); // Запись в файл Logs.txt foreach (string text in paths) { try { DateTime localDate = DateTime.Now; DateTime dt = Directory.GetLastWriteTime(text); DirectoryInfo di = new DirectoryInfo(text); string appendText = localDate.ToString() + " | " + text + " | " + dt + " | " + GetSizeInString(DirSize(di)) + Environment.NewLine; File.AppendAllText(pathText, appendText, Encoding.UTF8); } catch (IOException) { ; } } //удаление записей сделанных неделю назад, если таймер срабатывает каждые 2 часа string[] readText = System.IO.File.ReadAllLines(pathText); if (readText.Length > (7 * 12 * paths.Count)) { using (System.IO.StreamWriter file = new System.IO.StreamWriter(pathText, false)) { for (int i = 0; i < readText.Length; i++) { if (i > (paths.Count - 1)) file.WriteLine(readText[i]); } } } } // Вычисляем размер заданной директории private static long DirSize(DirectoryInfo d) { long Size = 0; // Add file sizes. FileInfo[] fis = d.GetFiles(); foreach (FileInfo fi in fis) { try { Size += fi.Length; } //Данное исключение делается для пропуска папок к которым нет доступа catch (UnauthorizedAccessException) { ; } } // Размер поддиректорий. DirectoryInfo[] dis = d.GetDirectories(); foreach (DirectoryInfo di in dis) { try { Size += DirSize(di); } //Данное исключение делается для пропуска папок к которым нет доступа catch (UnauthorizedAccessException) { ; } } return (Size); } // Преобразем размер в мегабайты private static string GetSizeInString(long size) { string postfix = "Mb"; double temp = (double)size; temp /= (1024 * 1024); return String.Format("{0:F}", temp) + " " + postfix; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д