Синхронизатор файлов. Хранение информации - C#
Формулировка задачи:
Всем привет. Пишу свой маленький синхронизатор данных между двумя папками на одном ПК, что-то типа гугл докс. Пишу для курсовой работы. Программа растёт из другой программы, которая аналог копированию windows. Т.е. сейчас она копирует в одну сторону. И тут я задумался я над такой проблемой. Т.к. она у меня будет копировать в обе стороны, то ей надо знать что копировать, а что нет. Я подумал, что неплохо было бы хранить информацию, о том когда, откуда и куда был скопирован каждый файл. Пока на этом всё. Как лучше решить данную проблему? Хранение и перезаписывание *.txt файла? работа с xml файлом? БД, я думаю сама собой отсекается.
То что сейчас имеется, кому интересно и чтоб было проще сориентироваться.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WFcopyfile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// копирование каталогов и файлов
public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
string path = @"E:\MyTest.txt";
if (!File.Exists(path))
{
File.Create(path);
CopyAll(source, target);
}
else
{
try
{
// Если каталог, в который необходимо скопировать файлы, не существует,
// то он создаётся
// Копируются все файлы из каталога в каталог
foreach (FileInfo fi in source.GetFiles())
{
fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
RecordToFile(source, target, path, fi);
}
// Рекурсивно копируется каждый каталог
foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
{
// после копирования одного каталога...
DirectoryInfo nextTargetSubDir =
target.CreateSubdirectory(diSourceSubDir.Name);
// ...функция вызывает сама себя до тех пор,
// пока все данные не будут скопированны
CopyAll(diSourceSubDir, nextTargetSubDir);
}
}
// исключение на случай, если пользователь введёт не правильно исходный каталог
// но тут еще надо обработать исключение если файл записи открыт
catch (Exception e)
{
MessageBox.Show("Файл с логом открыт! Закройте");
}
}
}
private static void RecordToFile(DirectoryInfo source, DirectoryInfo target, string path, FileInfo fi)
{
// в файл пишется дата, время, путь, куда скопирован файл и название файла
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(DateTime.Now.ToLongDateString() + " " + "|" +
" " + DateTime.Now.ToLongTimeString() + " " + "|" +
" " + source.FullName + "\\" + fi.Name + " " + "|" +
" " + target.FullName + "\\" + fi.Name);
}
}
private void btnCopyFiles_Click(object sender, EventArgs e)
{
// создаём две пустые строковые переменные, в которые будут
// записанны адреса каталогов для копирования
string sourceDirectory = string.Empty;
string targetDirectory = string.Empty;
// с помощью строковый переменных создаём экземпляры классов
// для работы с каталогами
List<string> mass = new List<string>();
var fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
sourceDirectory = fbd.SelectedPath;
if (fbd.ShowDialog() == DialogResult.OK)
targetDirectory = fbd.SelectedPath;
DirectoryInfo diSource = new DirectoryInfo(sourceDirectory);
DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);
CopyAll(diSource, diTarget);
foreach (FileInfo file in diSource.GetFiles("*.*"))
{
File.Copy(file.FullName, @targetDirectory + "\\" + file.Name, true);
}
}
/*
* Данный код позволяет находить в файле необходимую строку и заменять ее другой
* это заготовка, код будет дорабатываться
string str = string.Empty;
using (System.IO.StreamReader reader = System.IO.File.OpenText(@path))
{
str = reader.ReadToEnd();
}
str = str.Replace("ляляля", "777");
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\test.txt"))
{
file.Write(str);
}
*/
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "После нажатия кнопки ''Копировать'' необходимо бдует указать дерикторию, откуда будут копироваться файлы, а затем директорию, в которую будут копироваться файлы.";
}
}
}Решение задачи: «Синхронизатор файлов. Хранение информации»
textual
Листинг программы
watcher.EnableRaisingEvents = true