Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606

Синхронизатор файлов. Хранение информации

18.11.2014, 20:57. Показов 1512. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пишу свой маленький синхронизатор данных между двумя папками на одном ПК, что-то типа гугл докс. Пишу для курсовой работы. Программа растёт из другой программы, которая аналог копированию windows. Т.е. сейчас она копирует в одну сторону. И тут я задумался я над такой проблемой. Т.к. она у меня будет копировать в обе стороны, то ей надо знать что копировать, а что нет. Я подумал, что неплохо было бы хранить информацию, о том когда, откуда и куда был скопирован каждый файл. Пока на этом всё. Как лучше решить данную проблему? Хранение и перезаписывание *.txt файла? работа с xml файлом? БД, я думаю сама собой отсекается.
То что сейчас имеется, кому интересно и чтоб было проще сориентироваться.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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 = "После нажатия кнопки ''Копировать'' необходимо бдует указать дерикторию, откуда будут копироваться файлы, а затем директорию, в которую будут копироваться файлы.";
        }
 
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2014, 20:57
Ответы с готовыми решениями:

Хранение информации
Как программно реализовать: етсь textBox в него что небудь пишем и программа записывает это в переменную и хранит (в независимости...

Хранение информации в xaml
представим себе что есть редактор в котором мы можем построить что то на подобии блок схемы где указана определенная последовательность...

Хранение и быстрое получение информации
Необходимо использовать хранение данных временных. данные примерно такого типа Id, name, smena... В чем их хранить так чтобы с ними было...

13
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 463
18.11.2014, 21:43
а чем тхт плох?
0
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606
19.11.2014, 09:48  [ТС]
asql, хочу услышать другие мнения, как лучше реализовать функционал
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.11.2014, 13:47
Цитата Сообщение от CyberAlfred Посмотреть сообщение
услышать другие мнения, как лучше реализовать функционал
Извольте. Пошаговое руководство)))
1. Пишете приложение, в котором создаете, конфигурируете и используете FileSystemWatcher.
2. ВашFileSystemWatcher отслеживает все изменения с целевой директорией и дублирует все действия, копируя, удаляя, создавая дубликаты в другой директории.
3. Реализуем логику обработчика закрытия приложения, в которой, перед закрытием сканируем целевую директорию и создаем список имеющегося там содержимого, записывая все данные в файл (ятд, удобнее все-таки использовать xml, с ним проще работать).
3. При запуске приложения этот файл так же сканируется, далее сканируется директория-дубль и если произошли к-либо изменения - дублируем все изменения.
Вот как-то так...
0
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606
24.11.2014, 14:23  [ТС]
insite2012, т.е. мне лучше переписать прогу, используя FileSystemWatcher() и взять со своей программы функцию копирования файлов? и каталогов?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.11.2014, 15:36
Цитата Сообщение от CyberAlfred Посмотреть сообщение
мне лучше переписать прогу, используя FileSystemWatcher()
Это решать вам. Конечно, можно и свое что-то написать, но по сути это будет его аналогом. Создать отдельный поток (явно или не явно - через таймер), который будет постоянно работать и через какие-то промежутки времени сканировать целевую директорию. Ну и далее все как обычно...
0
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606
24.11.2014, 21:16  [ТС]
insite2012, т.е. я создаю новый экземпляр класса FileSystemWatcher
C#
1
2
string str = "E:\test";
FileSystemWatcher CopyFile = new FileSystemWatcher(@str);
Я так понимаю, он отслеживает какие-либо изменения в папке (открытие/создание/удаление/изменение каждого фала) и в зависимости от того, что происходит, он выполняет события OnChanged, OnCreated и т.д.

Не пойму только, как работает свойство SynchronizingObject?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.11.2014, 21:23
Цитата Сообщение от CyberAlfred Посмотреть сообщение
как работает свойство SynchronizingObject?
Оно вам ни к чему.

Добавлено через 34 секунды
Цитата Сообщение от CyberAlfred Посмотреть сообщение
в зависимости от того, что происходит, он выполняет события OnChanged, OnCreated и т.д.
Примерно так.
0
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606
26.11.2014, 13:55  [ТС]
insite2012, не понимаю как это всё работает. создал я новый класс FileSystemWatcher, который мониторит конкретную папку. при создании/копировании должен срабатывать Created и выводиться соответствующее сообщение. что я делаю не так????Оо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            string path = @"E:\test";
            FileSystemWatcher fsw = new FileSystemWatcher(path);
            fsw.Created +=new FileSystemEventHandler(fsw_Created);
            fsw.Deleted +=new FileSystemEventHandler(fsw_Deleted);
        }
        private static void fsw_Created(object source, EventArgs e)
        {
            MessageBox.Show("Created");
        }
        private static void fsw_Deleted(object source, EventArgs e)
        {
            MessageBox.Show("Deleted");
        }
    }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.11.2014, 14:11
Цитата Сообщение от CyberAlfred Посмотреть сообщение
не понимаю как это всё работает
CyberAlfred, а вот так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 WindowsFormsApplication33 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            string watcherPath = @"E:\test";
            FileSystemWatcher watcher = new FileSystemWatcher(watcherPath, "*.*");
            watcher.NotifyFilter = NotifyFilters.FileName
                | NotifyFilters.DirectoryName
                | NotifyFilters.CreationTime
                | NotifyFilters.LastWrite;
 
            watcher.Created += (s, e) => {
                MessageBox.Show("File created!");
            };
            watcher.Deleted += (s, e) => {
                MessageBox.Show("File deleted!");
            };
            watcher.EnableRaisingEvents = true;
        }
    }
}
1
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
26.11.2014, 14:21
Всего-то:
Цитата Сообщение от MSDN
The component will not watch the specified directory until the Path is set, and EnableRaisingEvents is true.
0
 Аватар для CyberAlfred
63 / 62 / 14
Регистрация: 16.12.2012
Сообщений: 606
26.11.2014, 17:33  [ТС]
insite2012, я понял, что всё дело в этой строчке
C#
1
watcher.EnableRaisingEvents = true
но я не понял что она делает? информирует watcher.Created о том, что что-то произошло?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.11.2014, 18:02
Цитата Сообщение от CyberAlfred Посмотреть сообщение
но я не понял что она делает?
Устанавливает в true свойство watcher-а, которое отвечает за генерацию событий.
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
26.11.2014, 18:12
Цитата Сообщение от CyberAlfred Посмотреть сообщение
но я не понял что она делает?
Всё написано в имени свойства: "Включить генерацию событий". Если оно равно false, события при изменении файловой системы генерироваться не будут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.11.2014, 18:12
Помогаю со студенческими работами здесь

Хранение информации не в БД. а в чем лучше?
Здравствуйте! У меня такой вопрос: Как создать Виндовс приложение, что бы туда можно было заносить: (Ф.И.О. ,год рождения, дата...

Хранение информации внутри программы
Нужно чтобы программа хранила информацию создавая не каких файлов Ну вот к примеру программа создаёт файл с настройками (Настройка в...

Хранение информации в самой сборке
Привет, допустим, у меня есть набор коэффициентов, 1-5, но эти коэффициенты могут меняться в дальнейшем и они участвуют в рассчете формул....

Временное хранение информации из базы данных
Всем привет! Вопрос вот в чём: существует база данных на удаленном сервере, к которой предполагается однократное подключение с целью ...

Хранение информации (изображения) в *dat-файле
private void openToolStripMenuItem_Click(object sender, EventArgs e) { Stream myStream; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru