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

Блог 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>

Комментарии

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

Оценка





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

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