Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгори Синхронизатор для двух папок и файлов в них 
:(
    Опции темы
ddll
Дата 14.3.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Здравствуйте!
Пишу синхронизатор для двух папок и файлов в них.
Вероятно надо рекурсивная функция сравнения.
Мне надо проверять по дате модификации файлов и в этом нет проблемы.
Проблема состоит в том что папка- в папке - в папке 5 папок и много файло- в каждой папке еще есть файлы и папки степень вложености может быть очень большой.
Как двигаться и с чего начать никак не могу придумать!

Проблема в том что не могу придумать до конца рекурсивную функцию. 

Заранее спасибо за помощь!

Это сообщение отредактировал(а) ddll - 14.3.2011, 22:15
PM MAIL   Вверх
mihryak
Дата 15.3.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



алгоритм таков:
- синхронизировать файлы в двух папках
- создать отстутствующие папки и там, и там
- повторить эти действия для папок, уже существующих и там, и там

Код

        class DirectoryComparer : IEqualityComparer<DirectoryInfo>
        {
            #region IEqualityComparer<DirectoryInfo> Members

            public bool Equals(DirectoryInfo x, DirectoryInfo y)
            {
                return StringComparer.OrdinalIgnoreCase.Equals(x.Name, y.Name);
            }

            public int GetHashCode(DirectoryInfo obj)
            {
                return obj.Name.ToLower().GetHashCode();
            }

            #endregion
        }

        static void SyncFolders(DirectoryInfo left, DirectoryInfo right)
        {
            SyncFiles(left, right);

            var comparer = new DirectoryComparer();

            var leftChildDirectories = left.GetDirectories();
            var rightChildDirectories = right.GetDirectories();

            leftChildDirectories.Except(rightChildDirectories, comparer).ToList()
                .ForEach(d => CopyFolder(d, right.CreateSubdirectory(d.Name)));
            rightChildDirectories.Except(leftChildDirectories, comparer).ToList()
                .ForEach(d => CopyFolder(d, left.CreateSubdirectory(d.Name)));

            leftChildDirectories.Intersect(rightChildDirectories, comparer).ToList()
                .ForEach(d => SyncFolders(d, new DirectoryInfo(Path.Combine(right.FullName, d.Name))));
        }

        static void CopyFolder(DirectoryInfo source, DirectoryInfo target)
        {
            source.GetFiles().ToList()
                .ForEach(f => f.CopyTo(Path.Combine(target.FullName, f.Name)));
            source.GetDirectories().ToList()
                .ForEach(d => CopyFolder(d, target.CreateSubdirectory(d.Name)));            
        }

        static void SyncFiles(DirectoryInfo left, DirectoryInfo right)
        {
            ........
        }

PM MAIL ICQ   Вверх
ddll
Дата 15.3.2011, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Спасибо большое но  я уже попробывал написать похожую рекурсивную функцию
Код

const string SKYDRIVE_FOLDER = @"dir1";
const string SERVER_FOLDER = @"dir2";
static void Main(string[] args)
{
CompareDir(SERVER_FOLDER,SKYDRIVE_FOLDER);
}

static void CompareDir(string FromDir, string ToDir)
{
Directory.CreateDirectory(ToDir);
foreach (string s1 in Directory.GetFiles(FromDir))
{

string s2 = ToDir + "\\" + Path.GetFileName(s1);
if (File.GetLastWriteTime(s1) > File.GetLastWriteTime(s2).AddHours(-13))
{
File.Copy(s1, s2,true);
File.SetLastWriteTime(s2, File.GetLastWriteTime(s1));
}
}
foreach (string s in Directory.GetDirectories(FromDir))
{
CompareDir(s, ToDir + "\\" + Path.GetFileName(s));
}
}
}





Это сообщение отредактировал(а) ddll - 15.3.2011, 18:59
PM MAIL   Вверх
jonie
Дата 15.3.2011, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



а можно взять готовое Microsoft Sync Framework, там  и провайдер синхронизации папок уже есть


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ddll
Дата 16.3.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Да нет проблемма в другом что у меня даты на сервере и на локальном компьютере разные.
Как вариант пришол к выводу хранить дату последней синхронизации и отслеживать файлы измененные после неё.
PM MAIL   Вверх
mrbrooks
Дата 16.3.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 17
Всего: 306



Цитата(ddll @  16.3.2011,  11:45 Найти цитируемый пост)
Да нет проблемма в другом что у меня даты на сервере и на локальном компьютере разные.

Это что реализация машины времени?

Я к тому - отчего бы не синхронизироваться с сервером по NTP/SNTP? А то выглядит, как то не кошерно.
PM MAIL   Вверх
AntonL
Дата 20.3.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 16.12.2008

Репутация: нет
Всего: нет



MD5 файлов считать, и можно хранить где нибудь, если не надо в обе стороны синхронизировать.
PM MAIL   Вверх
ddll
Дата 20.3.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Спасибо  AntonL надо в две стороны просто время будет не совсем одинаковым у меня между выполнением программы и времям даты модификации на сервере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.