Определение недавно измененных файлов
Блог 11 июня 2015
При работе над сложным проектом требуется перемещать файлы с тестового компьютера на рабочий.
Определять измененные файлы можно с помощью систем контроля версий. Однако если их много, а желания копировать весь проект нет, то можно написать простое консольное приложение.
При "накатывании" новых файлов полезно созранять старую версию. И в случае обнаружения проблем делать откат. Для этого введем специальные параметры 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>
Комментарии
Комментариев еще нет.
Добавить комментарий могут только авторизованные пользователи.
Авторизоваться