Определение недавно измененных файлов

Блог 11 июня 2015

Теги: компьютеры,C#,программирование,создание курсов

При работе над сложным проектом требуется перемещать файлы с тестового компьютера на рабочий. Определять измененные файлы можно с помощью систем контроля версий. Однако если их много, а желания копировать весь проект нет, то можно написать простое консольное приложение.

При "накатывании" новых файлов полезно созранять старую версию. И в случае обнаружения проблем делать откат. Для этого введем специальные параметры root, rootcopy, pushcopy. Делаем прогон программы на тестовом сервере, используем root, rootcopy. Проект находится в root. Измененные файлы копируются в rootcopy. rootcopy переносим на рабочий сервер. Там rootcopy становится root, а проект - rootcopy. Устанавливаем большое значение для hours и делаем прогон программы. При желании задаем pushcopy - туда попадут старые версии файлов для отката.

Код программы.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Configuration;

namespace new_files
{
    class Program
    {
        static string dirs, sLogFile, root, rootcopy, pushcopy;
        static int hours, total = 0;

        static void Main(string[] args)
        {
            // читаем параметры конфигурационного файла
        
            // какие папки обработать
            dirs = ConfigurationManager.AppSettings["dirs"];
            
            // файл для логирования
            sLogFile = ConfigurationManager.AppSettings["log"];
            
            // сколько часов разницы
            hours = int.Parse(ConfigurationManager.AppSettings["hours"]);
            
            // где корень проекта
            root = ConfigurationManager.AppSettings["root"];
            
            // корень для копирования
            rootcopy = ConfigurationManager.AppSettings["rootcopy"];
            
            // корень для сохранения
            pushcopy = ConfigurationManager.AppSettings["pushcopy"];

            Console.WriteLine("Started");
            log("Started");

            string[] arr = dirs.Split(';');
            for (int i = 0; i < arr.Length; i++)
            {
                if (Directory.Exists(arr[i]) == false)
                {
                    log("not found " + arr[i]);
                    continue;
                }

                ProcessDir(arr[i]);
            }
            Console.WriteLine("scan total " + total);
            log("scan total " + total);

            Console.ReadKey();
        }

        // рекурсивная обработка папки
        static void ProcessDir(string sDir)
        {
            try
            {
                string[] files = Directory.GetFiles(sDir);
                for (int i = 0; i < files.Length; i++)
                {
                    DateTime dtMod = File.GetLastWriteTime(files[i]);
                    if (DateTime.Now.Subtract(dtMod).TotalHours < hours)
                    {   // обнаружен недавно измененный файл
                        log("fi " + files[i] + " " + dtMod.ToShortDateString() + " " + dtMod.ToShortTimeString());
                        if (!string.IsNullOrEmpty(root) && !string.IsNullOrEmpty(rootcopy))
                            CopyMe(files[i]);
                    }

                    total++;
                    if (total % 1000 == 0)
                        Console.WriteLine(files[i]);
                }

                string[] subDirs = Directory.GetDirectories(sDir);
                for (int i = 0; i < subDirs.Length; i++)
                {
                    ProcessDir(subDirs[i]);
                }
            }
            catch (Exception e)
            {
                log(e.ToString());
            }
        }

        // логирование
        public static void log(String s)
        {
            try
            {
                StreamWriter sw = new StreamWriter(sLogFile, true, Encoding.GetEncoding(1251));
                sw.WriteLine(string.Format("{0:yyyy-MM-dd HH:mm:ss} ", DateTime.Now) + s);
                sw.Close();
            }
            catch (Exception se)
            {
                Console.WriteLine(se.Message);
            }
        }

        // копирование недавно измененного файла
        static void CopyMe(string file)
        {
            int i;
            int ipos = file.ToLower().IndexOf(root.ToLower());
            if (ipos < 0) return;
            string bz = file.Substring(root.Length);
            string[] arr = bz.Split('\\');
            string sDir = rootcopy;
            for (i = 0; i < arr.Length - 1; i++)
            {
                sDir += arr[i];
                if (Directory.Exists(sDir) == false)
                    Directory.CreateDirectory(sDir);
                sDir += "\\";
            }

            if (!string.IsNullOrEmpty(pushcopy))
            {   // сохранить старую версию
                sDir = pushcopy;
                for (i = 0; i < arr.Length - 1; i++)
                {
                    sDir += arr[i];
                    if (Directory.Exists(sDir) == false)
                        Directory.CreateDirectory(sDir);
                    sDir += "\\";
                }

                File.Copy(rootcopy + bz, pushcopy + bz, true);
            }

            File.Copy(file, rootcopy + bz, true);
        }
    }
}

Пояснения к коду программы.

Алгоритм прямолинейный. Считать конфигурацию. Рекурсивно "пробежать" по вложенным папкам и найти недавно измененные файлы. При необходимости сделать копию. Смотри также Создание "прозрачного" png-файла.

Пример конфигурационного файла

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="dirs" value="C:\trunk\eShopUtils\"/>
    <add key="log" value="C:\temp\new_files.log"/>
    <add key="hours" value="48"/>
    <add key="root" value="C:\trunk\eShopUtils\"/>
    <add key="rootcopy" value="C:\temp\wa_newfiles\"/>
    <add key="pushcopy" value="C:\temp\wa_pushcopy\"/>
  </appSettings>
</configuration>

Комментарии

Комментариев еще нет.
Добавить комментарий могут только авторизованные пользователи. Авторизоваться
Комментарий

Оценка





Авторизоваться через https://www.pvobr.ru
Логин
Пароль
Регистрация

Авторизоваться через соцсети
Наверх

создание курсов

студия разработки сайтов   про дистанционное обучение   дистанционное образование   дистанционные курсы повышения   образование дистанционно   создание сайта магазина   центр дистанционного обучения   анализ сайта аудит   система дистанционного образования   дистанционные технологии   разработка сайта интернет магазина   создание интернет магазина под ключ   система дистанционного обучения   создание сайтов