Система синхронизации каталогов устройств
Разработка приложения, автоматизирующего процесс синхронизации файлов между сменным носителем и каталогом на другом диске. Классы для работы с файловой системой. Интерфейс программы и способы взаимодействия пользователя с ним. Создание новой синхропары.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.10.2015 |
Размер файла | 632,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
break;
case SyncState.Off:
case SyncState.NotAvailable:
if (fileWatcherA != null)
fileWatcherA.Dispose();
if (fileWatcherB != null)
fileWatcherB.Dispose();
fileWatcherA = null;
fileWatcherB = null;
autoSync = false;
syncList.Clear();
break;
case SyncState.Ok:
case SyncState.UnSuccess:
syncList.Clear();
autoSync = true;
if (fileWatcherA == null && AllowAutoSync)
{
fileWatcherA = new FileSystemWatcher(pathA);
fileWatcherA.Changed += new FileSystemEventHandler(dirChanged);
fileWatcherA.Created += new FileSystemEventHandler(dirChanged);
fileWatcherA.Renamed += new RenamedEventHandler(dirRenamed);
fileWatcherA.Deleted += new FileSystemEventHandler(dirDeleted);
fileWatcherA.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastWrite;
fileWatcherA.IncludeSubdirectories = true;
fileWatcherA.EnableRaisingEvents = true;
}
if (fileWatcherB == null && AllowAutoSync)
{
fileWatcherB = new FileSystemWatcher(pathB);
fileWatcherB.Changed += new FileSystemEventHandler(dirChanged);
fileWatcherB.Created += new FileSystemEventHandler(dirChanged);
fileWatcherB.Renamed += new RenamedEventHandler(dirRenamed);
fileWatcherB.Deleted += new FileSystemEventHandler(dirDeleted);
fileWatcherB.NotifyFilter = NotifyFilters.DirectoryName |
NotifyFilters.FileName | NotifyFilters.LastWrite;
fileWatcherB.IncludeSubdirectories = true;
fileWatcherB.EnableRaisingEvents = true;
}
break;
}
}
}
public bool Selected
{
get { return selected; }
set { selected = value; }
}
public string StateString
{
get
{
if (state == SyncState.InProcess && progressMess == "")
return StateStrings.Items[(int)SyncState.Analyzing];
else
return StateStrings.Items[(int)state];
}
}
public bool NeedShow
{
get
{
bool buf = needShow;
needShow = false;
return buf;
}
set { needShow = value; }
}
void dirChanged(object sender, FileSystemEventArgs e)
{
if (e.FullPath.StartsWith(pathA) && !e.FullPath.StartsWith(pathB))
remA = true;
else
remB = true;
state = SyncState.Analyzing;
needSync = true;
if (fileWatcherA != null)
{
fileWatcherA.Dispose();
fileWatcherA = null;
}
if (fileWatcherB != null)
{
fileWatcherB.Dispose();
fileWatcherB = null;
}
}
void dirDeleted(object sender, FileSystemEventArgs e)
{
if (e.FullPath.StartsWith(pathA) && !e.FullPath.StartsWith(pathB))
remA = true;
else
remB = true;
state = SyncState.Analyzing;
needSync = true;
if (fileWatcherA != null)
{
fileWatcherA.Dispose();
fileWatcherA = null;
}
if (fileWatcherB != null)
{
fileWatcherB.Dispose();
fileWatcherB = null;
}
}
void dirRenamed(object sender, RenamedEventArgs e)
{
if (e.OldFullPath.StartsWith(pathA) && !e.OldFullPath.StartsWith(pathB))
remA = true;
else
remB = true;
state = SyncState.Analyzing;
needSync = true;
if (fileWatcherA != null)
{
fileWatcherA.Dispose();
fileWatcherA = null;
}
if (fileWatcherB != null)
{
fileWatcherB.Dispose();
fileWatcherB = null;
}
}
public bool DirsExists()
{
if (Directory.Exists(pathA) && Directory.Exists(pathB))
return true;
else
return false;
}
public SyncDirs()
{
progressMess = "";
progressPercent = -1;
state = SyncState.Ok;
remA = false;
remB = false;
selected = false;
needShow = false;
needSync = true;
autoSync = false;
allowAutoSync = true;
syncList = new Dictionary<string, SyncMode>();
backgroundSync = new BackgroundWorker();
backgroundSync.WorkerSupportsCancellation = true;
backgroundSync.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundSync_DoWork);
backgroundSync.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundSync_RunWorkerCompleted);
backgroundSync.ProgressChanged += new ProgressChangedEventHandler(reportProgress);
backgroundSync.WorkerReportsProgress = true;
}
public SyncDirs(string pathA, string pathB, SyncState state, bool allowAutoSync)
: this()
{
PathA = pathA;
PathB = pathB;
if (!allowAutoSync && state == SyncState.Off)
state = SyncState.Analyzing;
this.state = state;
this.allowAutoSync = allowAutoSync;
}
public SyncDirs(string pathA, string pathB, string markA, string markB, SyncState state, bool allowAutoSync)
: this(pathA, pathB, state, allowAutoSync)
{
this.markA = markA;
this.markB = markB;
}
public static bool IsValidPaths(string pathA, string pathB,
ref string errMess)
{
errMess = null;
if (pathA == "")
errMess = "Выберите каталог А";
else if (pathB == "")
errMess = "Выберите каталог Б";
else
{
if (pathA[pathA.Length - 1] == '\\')
pathA = pathA.Remove(pathA.Length - 1, 1);
if (pathB[pathB.Length - 1] == '\\')
pathB = pathB.Remove(pathB.Length - 1, 1);
if (!Directory.Exists(pathA))
errMess =
"Такого пути не существует! (Каталог А)";
else if (!Directory.Exists(pathB))
errMess =
"Такого пути не существует! (Каталог Б)";
else if (Path.Equals(pathA, pathB))
errMess =
"Нет смысла синхронизировать каталог сам с собой...";
else if (pathA.StartsWith(pathB) && pathA.Substring(pathB.Length).Contains("\\"))
errMess =
"Не надо пытаться синхронизировать корневой каталог с его дочерними...";
else if (pathB.StartsWith(pathA) && pathB.Substring(pathA.Length).Contains("\\"))
errMess =
"Не надо пытаться синхронизировать корневой каталог с его дочерними...";
}
return (errMess == null);
}
void backgroundSync_RunWorkerCompleted(object s, RunWorkerCompletedEventArgs e)
{
needShow = true;
needSync = false;
progressMess = "";
progressPercent = -1;
try
{
if (!success && File.Exists(CustomFileCopier.lastCopiedFile))
File.Delete(CustomFileCopier.lastCopiedFile);
}
catch (Exception)
{
}
_resetEvent.Set();
}
public void Cancel()
{
success = false;
_resetEvent.WaitOne();
try
{
if (File.Exists(CustomFileCopier.lastCopiedFile))
File.Delete(CustomFileCopier.lastCopiedFile);
}
catch (Exception)
{ }
}
public void Analyze()
{
State = SyncState.InProcess;
if (!backgroundSync.IsBusy)
backgroundSync.RunWorkerAsync();
}
private void backgroundSync_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string fileSystemEntry;
FileInfo fileA;
FileInfo fileB;
SyncMode mode;
if (syncList.Count == 0)
{
foreach (string currentFile in Directory.EnumerateFileSystemEntries(pathA))
{
fileSystemEntry = currentFile.Substring(pathA.Length);
if (fileSystemEntry == "\\" + MainForm.FileRemConf ||
fileSystemEntry.StartsWith("\\~"))
continue;
fileA = new FileInfo(pathA + fileSystemEntry);
fileB = new FileInfo(pathB + fileSystemEntry);
if (Directory.Exists(pathB + fileSystemEntry))
{
int cmp = DirsCompare(fileA.FullName, fileB.FullName);
if (cmp != 0)
{
if (cmp>0)
mode = SyncMode.AToB;
else
mode = SyncMode.BToA;
if (remA)
mode = SyncMode.AToB;
if (remB)
mode = SyncMode.BToA;
syncList.Add(fileSystemEntry, mode);
}
}
else if (!File.Exists(pathB + fileSystemEntry) ||
fileA.LastWriteTime != fileB.LastWriteTime)
{
mode = SyncMode.AToB;
if (remB)
mode = SyncMode.BToA;
if (remA)
mode = SyncMode.AToB;
syncList.Add(fileSystemEntry, mode);
}
}
foreach (string currentFile in Directory.EnumerateFileSystemEntries(pathB))
{
fileSystemEntry = currentFile.Substring(pathB.Length);
if (fileSystemEntry == "\\" + MainForm.FileRemConf ||
fileSystemEntry.StartsWith("\\~"))
continue;
if (!Directory.Exists(pathA + fileSystemEntry) && !File.Exists(pathA + fileSystemEntry))
{
mode = SyncMode.BToA;
if (remB)
mode = SyncMode.BToA;
if (remA)
mode = SyncMode.AToB;
syncList.Add(fileSystemEntry, mode);
}
}
}
if (syncList.Count > 0)
{
needShow = true;
if (autoSync)
//k
Synchronize();
else
State = SyncState.WaitSolution;
}
else
State = SyncState.Ok;
remA = false;
remB = false;
needSync = true;
}
private static int DirsCompare(string dirNameA, string dirNameB)
{
foreach (string fileNameA in Directory.GetDirectories(dirNameA, "*"))
{
string fileNameB = fileNameA.Replace(dirNameA, dirNameB);
if (Directory.Exists(fileNameB))
{
int cmpRes = DirsCompare(fileNameA, fileNameB);
if (cmpRes != 0)
return cmpRes;
}
else
return 1;
}
foreach (string fileNameB in Directory.GetDirectories(dirNameB, "*"))
{
string fileNameA = fileNameB.Replace(dirNameB, dirNameA);
if (!Directory.Exists(fileNameA))
return 1;
}
FileInfo fileA, fileB;
foreach (string fileName in Directory.GetFiles(dirNameA, "*.*"))
{
fileA = new FileInfo(fileName);
fileB = new FileInfo(fileName.Replace(dirNameA, dirNameB));
if (fileB.Exists)
{
if (fileA.LastWriteTime != fileB.LastWriteTime)
return fileA.LastWriteTime.CompareTo(fileB.LastWriteTime);
}
else
return 1;
}
foreach (string fileName in Directory.GetFiles(dirNameB, "*.*"))
{
fileA = new FileInfo(fileName.Replace(dirNameB, dirNameA));
if (!fileA.Exists)
return -1;
}
return 0;
}
private void Synchronize()
{
int compliteCount = 0;
progressMess = " ";
needShow = true;
List<string> removeItems = new List<string>();
foreach (var item in syncList)
{
switch (item.Value)
{
case SyncMode.AToB:
syncDirsProcess(pathA, pathB, item.Key);
compliteCount++;
break;
case SyncMode.BToA:
syncDirsProcess(pathB, pathA, item.Key);
compliteCount++;
break;
case SyncMode.NoneNync:
success = false;
break;
}
if (success)
removeItems.Add(item.Key);
if (syncList.Count == 0)
break;
}
if (compliteCount == syncList.Count)
{
if (AllowAutoSync)
{
if (success)
State = SyncState.Ok;
else
State = SyncState.UnSuccess;
}
else
State = SyncState.Off;
}
else
State = SyncState.WaitSolution;
foreach (string item in removeItems)
syncList.Remove(item);
}
void syncDirsProcess(string pathA, string pathB, string file)
{
success = true;
try
{
if (Directory.Exists(pathA + file))
{
Directory.CreateDirectory(pathB + file);
foreach (string dirPath in Directory.GetDirectories(pathA + file, "*"))
syncDirsProcess(pathA, pathB, dirPath.Substring(pathA.Length));
foreach (string dirPath in Directory.GetDirectories(pathB + file, "*"))
{
if (!Directory.Exists(dirPath.Replace(pathB, pathA)))
Directory.Delete(dirPath, true);
}
foreach (string fileName in Directory.GetFiles(pathB + file, "*.*"))
{
if (!File.Exists(fileName.Replace(pathB, pathA)))
File.Delete(fileName);
}
foreach (string newFile in Directory.GetFiles(pathA + file, "*.*"))
{
FileInfo fileA = new FileInfo(newFile);
FileInfo fileB = new FileInfo(newFile.Replace(pathA, pathB));
if (!fileB.Exists || fileA.LastWriteTime > fileB.LastWriteTime)
{
backgroundSync.ReportProgress(1, fileA.Name);
CustomFileCopier fileCopier = new CustomFileCopier(newFile, newFile.Replace(pathA, pathB));
fileCopier.OnProgressChanged += new ProgressChangeDelegate(fileCopier_OnProgressChanged);
fileCopier.Copy();
}
}
}
else
{
if (File.Exists(pathA + file))
{
backgroundSync.ReportProgress(1, (new FileInfo(pathA + file)).Name);
CustomFileCopier fileCopier = new CustomFileCopier(pathA + file, pathB + file);
fileCopier.OnProgressChanged += new ProgressChangeDelegate(fileCopier_OnProgressChanged);
fileCopier.Copy();
}
else if (File.Exists(pathB + file))
File.Delete(pathB + file);
else
Directory.Delete(pathB + file, true);
}
}
catch (Exception)
{
success = false;
}
}
void reportProgress(object sender, ProgressChangedEventArgs e)
{
progressMess = e.UserState.ToString();
}
void fileCopier_OnProgressChanged(double persentage,
ref bool cancel)
{
if (!success)
cancel = true;
progressPercent = persentage;
}
}
Приложение Д
Исходный код сущности коллекции синхропар
class SyncDirsList : List<SyncDirs>
{
StatusStrip statusStrip;
ListView listView;
SyncDirs currentTask;
Queue<SyncDirs> itemsInProcess;
bool stateChanged;
public SyncDirs CurrentTask
{
get { return currentTask; }
}
public bool StateChanged
{
get
{
bool bufVal = stateChanged;
if (bufVal)
stateChanged = false;
return bufVal;
}
set { stateChanged = value; }
}
internal Queue<SyncDirs> ItemsInProcess
{
get { return itemsInProcess; }
}
public ListView ListView
{
get { return listView; }
set { listView = value; }
}
public SyncDirsList(ListView listView, StatusStrip statusStrip)
{
this.listView = listView;
this.statusStrip = statusStrip; ;
itemsInProcess = new Queue<SyncDirs>();
currentTask = new SyncDirs();
stateChanged = true;
}
public new void Add(SyncDirs newItem)
{
base.Add(newItem);
ListViewItem parentItem = new ListViewItem(newItem.PathA);
ListViewItem.ListViewSubItem childItem = new ListViewItem.ListViewSubItem(parentItem, newItem.PathB);
ListViewItem.ListViewSubItem childItem2 = new ListViewItem.ListViewSubItem(parentItem, newItem.StateString);
parentItem.SubItems.Add(childItem);
parentItem.SubItems.Add(childItem2);
parentItem.Tag = newItem;
listView.Items.Add(parentItem);
stateChanged = true;
}
public new bool Remove(SyncDirs removingItem)
{
foreach (ListViewItem item in listView.Items)
if (item.Tag == removingItem)
{
if (removingItem == currentTask)
{
currentTask.Cancel();
currentTask = new SyncDirs();
}
listView.Items.Remove(item);
base.Remove(removingItem);
stateChanged = true;
return true;
}
return false;
}
public void UpdateList()
{
if (!StateChanged)
return;
listView.Items.Clear();
ListViewItem pIPathA;
string pathA, pathB;
foreach (SyncDirs item in this)
{
pathA = item.MarkA != "" ? "[" + item.MarkA + "] " + item.PathA : item.PathA;
pathB = item.MarkB != "" ? "[" + item.MarkB + "] " + item.PathB : item.PathB;
pIPathA = new ListViewItem(pathA);
ListViewItem.ListViewSubItem cIPathB = new ListViewItem.ListViewSubItem(pIPathA, pathB);
ListViewItem.ListViewSubItem cIState = new ListViewItem.ListViewSubItem(pIPathA, item.StateString);
pIPathA.SubItems.Add(cIPathB);
pIPathA.SubItems.Add(cIState);
pIPathA.Tag = item;
pIPathA.Selected = item.Selected;
listView.Items.Add(pIPathA);
}
}
public void SelSetState(SyncState state)
{
SyncDirs sDItem;
List<ListViewItem> items = new List<ListViewItem>();
foreach (ListViewItem item in listView.SelectedItems)
items.Add(item);
foreach (ListViewItem item in items)
{
item.Selected = true;
sDItem = (SyncDirs)item.Tag;
if (sDItem == currentTask)
if (state != SyncState.InProcess || state != SyncState.Analyzing)
{
currentTask.Cancel();
currentTask = new SyncDirs();
}
else
continue;
sDItem.State = state;
sDItem.SyncList.Clear();
}
stateChanged = true;
UpdateList();
}
public string SyncsUpdate()
{
SyncState state = SyncState.Ok;
foreach (SyncDirs item in this)
{
if (item.State != SyncState.Off)
{
if (!item.DirsExists())
{
if (item.State != SyncState.NotAvailable)
{
item.State = SyncState.NotAvailable;
stateChanged = true;
}
}
else if (item.State == SyncState.NotAvailable)
item.State = SyncState.Analyzing;
}
if (item.State == SyncState.Analyzing || item.State == SyncState.Ok || item.State == SyncState.UnSuccess)
{
if (item.NeedSync)
{
item.State = SyncState.WaitProcess;
if (!itemsInProcess.Contains(item))
itemsInProcess.Enqueue(item);
stateChanged = true;
}
else if (item.State == SyncState.Analyzing)
{
item.State = SyncState.Ok;
stateChanged = true;
}
}
if (item.State == SyncState.WaitSolution)
{
state = SyncState.WaitSolution;
}
}
if (currentTask.State != SyncState.InProcess && itemsInProcess.Count > 0)
{
currentTask = itemsInProcess.Dequeue();
if (currentTask.State == SyncState.WaitProcess)
{
currentTask.Analyze();
stateChanged = true;
}
}
if (currentTask.NeedShow)
{
if (currentTask.State == SyncState.Ok)
currentTask = new SyncDirs();
stateChanged = true;
}
if (currentTask.State == SyncState.InProcess)
state = SyncState.InProcess;
UpdateList();
StringBuilder programmState =
new StringBuilder("SyncDrive - ");
if (state != SyncState.InProcess)
{
if (statusStrip.Items[1].Text != "" && !statusStrip.Items[0].Visible)
{
statusStrip.Items[1].Text = "";
statusStrip.Items[3].Visible = false;
(statusStrip.Items[3] as ToolStripProgressBar).Value = 0;
}
}
switch (state)
{
case SyncState.Ok:
programmState.Append("Все ок");
break;
case SyncState.UnSuccess:
programmState.Append("Не все ок");
statusStrip.Items[3].Visible = false;
break;
case SyncState.InProcess:
programmState.Append("Идет синхронизация...");
string progressMess = currentTask.ProgressMess;
double progress = currentTask.ProgressPercent;
if (progressMess != "")
{
statusStrip.Items[1].Text = "Идет копирование: " + progressMess;
if (progress > -1)
{
statusStrip.Items[3].Visible = true;
(statusStrip.Items[3] as ToolStripProgressBar).Value = (int)progress;
}
statusStrip.Update();
}
break;
case SyncState.WaitSolution:
programmState.Append("Выберите направление синхронизации");
break;
}
return programmState.ToString();
}
public void UpdatePaths(string oldDrive, string newDrive)
{
foreach (SyncDirs item in this)
{
if (item.PathA[0] == oldDrive[0])
item.PathA = newDrive[0] + item.PathA.Remove(0, 1);
if (item.PathB[0] == oldDrive[0])
item.PathB = newDrive[0] + item.PathB.Remove(0, 1);
}
}
}
Размещено на Allbest.ru
Подобные документы
Проектирование программного обеспечения. Схема начального формирования каталога файлов, вывода на экран каталога файлов, удаления файлов, сортировки файлов по имени, дате создания и размеру методом прямого выбора. Управление каталогом в файловой системе.
курсовая работа [804,0 K], добавлен 08.01.2014Понятия файлов и каталогов. Область внешней памяти, группа файлов на одном носителе. Древовидная структура файлов на диске. Имя и местонахождение файла. Маршрут или путь по файловой системе. Запись имени файла в DOSе. Шаблоны. Структура каталога.
лабораторная работа [15,2 K], добавлен 30.09.2008Механизмы взаимодействия драйвера режима ядра и пользовательского приложения: многослойная драйверная архитектура, алгоритм сокрытия данных, взаимодействие драйвера и приложения, пользовательский интерфейс программы фильтрации доступа к файлам.
курсовая работа [1023,3 K], добавлен 23.06.2009Особенности работы "поисковика" дублирующихся файлов на диске. Выбор среды программирования. Разработка программного продукта. Основные требования, предъявляемые к программе, производящей поиск дублирующихся файлов на диске. Отображение скрытых файлов.
курсовая работа [1,8 M], добавлен 28.03.2015Особенности работы в среде оболочки NORTON COMMANDER. Взаимодействие с операционной системой. Формат показа оглавления каталога. Просмотр в панели дерева каталогов, информации о диске. Режим быстрого просмотра файлов. Управление отображением панелей.
реферат [584,0 K], добавлен 17.05.2009История разработки многозадачной операционной системы POSIX-стандарта - FreeBSD; описание ее виртуальной памяти, файловой системы, уровня защиты. Описание основных средств синхронизации процессов - сигналов и семафоров. Способы блокировки файлов.
презентация [584,2 K], добавлен 02.06.2011Создание потока с помощью конструктора на основе класса Thread, интерфейса Runnable, синхронизации потоков. Краткая справка по необходимым программным компонентам. Составление программы анимации мячей пространстве окна. Диаграмма классов приложения.
лабораторная работа [884,9 K], добавлен 01.05.2014Разработка проекта системы, программы, интерфейса взаимодействия пользователя с системой. Программная база для реализации проекта "Электронная администрация". Создание удобной среды для пользователей системы. Разработка форм входных и выходных данных.
дипломная работа [3,9 M], добавлен 20.06.2012Уровни эталонной модели взаимодействия OSI/ISO. Классы сервиса транспортного уровня. Функции сеансового уровня по управлению диалогом, синхронизации и управления активностью. Услуги транспортного уровня. Классы и процедуры транспортного протокола.
реферат [125,7 K], добавлен 11.07.2013Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013