Получение информации о сетевой папке - 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;
}
}
}