Получение информации о сетевой папке - 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;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д