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

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


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

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

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