Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileManager – основной класс движка приложения 
:(
    Опции темы
Rohoss
  Дата 16.6.2010, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Основное назначения класса, копировать/перемещать/удалять/удалять в корзину файлы и директории. Дополнительные возможности смотрите по интерфейсу  smile 

Вот интерфейс класса:

Код

public enum FileOperationKind
{
    Copy,
    Move,
    Delete,
    DeleteToRecycler
}

/// <summary>
/// Состояние файловых операций
/// </summary>
public enum FileOperationState
{
    /// <summary>
    /// Данное состояние бывает сразу после создания экземпляра FileManager,
    /// и по завершению файловых операций. 
    /// Только в этом состоянии можно вызвать метод Start, 
    /// класса FileManager. Или получим исключение.
    /// </summary>
    Ready,      

    /// <summary>
    /// В данном состоянии файловые операции как раз выполняются
    /// </summary>
    Working,

    /// <summary>
    /// Приостановлено методом Pause
    /// </summary>
    Paused,

    /// <summary>
    /// Ожидание ответа. Возникает при генерации события CreateQuestion
    /// Убирается при выполнении метода Rewrite
    /// </summary>
    WaitAnswer,

    /// <summary>
    /// Операция прервана
    /// </summary>
    Aborted
}

/// <summary>
/// Определяет, что делать, если такой FileSystemInfo уже существует
/// </summary>
public enum RewriteKind
{
    /// <summary>
    /// В любом случае перезаписываем
    /// </summary>
    YesToAll,

    /// <summary>
    /// В любом случае пропускаем
    /// </summary>
    NoToAll,

    /// <summary>
    /// Генерируем событие CreateQuestion 
    /// и меняем состояние на FileOperationState.WaitAnswer
    /// </summary>
    Question
}


public class FileManager
{
    public delegate void ChangeProgressEventHandler(FileManager sender, int percent, bool progressActive);

    public delegate void ChangeStatusTextEventHandler(FileManager sender, string textFrom, string textTo);

    public delegate void ChangeStateEventHandler(FileManager sender, FileOperationState state);

    public delegate void CreateQuestionEventHandler(FileManager sender, FileSystemInfo existFileOrDir);

    public delegate void CreateWarningEventHandler(FileManager sender, string warningText);

    /// <summary>
    /// Отображает общий прогресс файловых операций. 
    /// Событие генерируется каждый раз, когда количество процентов возрастает хотя бы на 1.
    /// </summary>
    public event ChangeProgressEventHandler ChangeTotalProgress;
    
    /// <summary>
    /// Отображает общий прогресс текущей файловой операции. 
    /// Событие генерируется каждый раз, когда количество процентов возрастает хотя бы на 1.
    /// </summary>
    public event ChangeProgressEventHandler ChangeCurrentProgress;
    
    /// <summary>
    /// Выводит имена файлов, копируемых в данный момент
    /// </summary>
    public event ChangeStatusTextEventHandler ChangeStatusText;
    
    /// <summary>
    /// Генерируется при изменении состояния State
    /// </summary>
    public event ChangeStateEventHandler ChangeState;
    
    /// <summary>
    /// Создаётся, если нужно перезаписать файл и RewriteMay == RewriteKind. Question
    /// Дальше, состояние переходит в State == FileOperationState.WaitAnswer
    /// И файловые операции приостанавливаются до вызова метода Rewrite()
    /// </summary>
    public event CreateQuestionEventHandler CreateQuestion;
    
    /// <summary>
    /// Генерируется при ошибках. Например, файл не удалось скопировать и тд…
    /// </summary>
    public event CreateWarningEventHandler CreateWarning;


    /// <summary>
    /// Основной метод класса. Начинает операции с файлами.
    /// </summary>
    /// <param name="from">Список FileSystemInfo для копирования</param>
    /// <param name="to">Директория, в которую копировать</param>
    /// <param name="operation">Тип файловой операции</param>
    public void Start(List<FileSystemInfo> from, DirectoryInfo to, FileOperationKind operation);
    
    /// <summary>
    /// Процесс приостанавливается. Восстанавливается только при вызове метода Suspend()
    /// Состояние переходит в State = FileOperationState.Paused
    /// </summary>
    public void Pause();
    
    /// <summary>
    /// Процесс продолжает работать, только если был остановлен методом Pause()
    /// Соответственно он должен иметь состояние State == FileOperationState.Paused
    /// </summary>
    public void Renew();
    
    /// <summary>
    /// Прерывает операции. Устанавливает State == FileOperationState.Aborted
    /// </summary>
    public void Abort();
    
    /// <summary>
    /// Варианты перезаписи файла. 
    /// Метод имеет смысл только в том случае, когда State == FileOperationState.WaitAnswer
    /// </summary>
    /// <param name="rewrite">Если rewrite == true, то перезаписываем</param>
    public void Rewrite(bool rewrite);
    
    /// <summary>
    /// Размер буфера файловой операции (порция данных, которая копируется за раз) в байтах
    /// </summary>
    public int BufferSize
    {
        get;
        set;
    }
    
    /// <summary>
    /// Состояние, в котором находятся файловые операции класса
    /// </summary>
    public FileOperationState State
    {
        get;
    }
    
    /// <summary>
    /// Варианты перезаписи файла, если таковой уже существует
    /// </summary>
    public RewriteKind RewriteWay
    {
        get;
        set;
    }
}



Жду вопросов, критики и желающих реализовать данный класс  smile 

Обсуждение архитектуры движка тут Ядро приложения

Это сообщение отредактировал(а) Rohoss - 18.6.2010, 18:49


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
mr.Anderson
Дата 16.6.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Я могу заняться, дело нехитрое. Предлагаю еще добавить понятие транзакции сюда, правда, пока не особо представляю как это реализовать, но добавить определенно надо.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Rohoss
  Дата 16.6.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(mr.Anderson @  16.6.2010,  23:29 Найти цитируемый пост)
Предлагаю еще добавить понятие транзакции сюда, правда, пока не особо представляю как это реализовать, но добавить определенно надо.

Интересно smile . Но может лучше оставим на следующую версию? Когда будет работающее приложение, лучше будет представить, как добавить механизм транзакций...



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
mr.Anderson
Дата 16.6.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Да а какая разница. Я сделаю текущий функционал, оставлю как рабочую версию и буду работать над транзакциями. Только вот ввели бы в курс дела, как юзать вообще средство контроля версий. Я ни с одним не работал.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Rohoss
Дата 17.6.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(mr.Anderson @  16.6.2010,  23:45 Найти цитируемый пост)
. Только вот ввели бы в курс дела, как юзать вообще средство контроля версий. Я ни с одним не работал.

Хорошо, ну чуть позже. Пока начинать можете без системы контроля версий. А за одно, можно скачать TortoiseHg (GUI для Mercurial, Mercurial идёт в комплекте с ним) и начать привыкать к нему  smile 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Egeni
Дата 17.6.2010, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а как на счет возможности сравнения двух текстовых файлов и вывода похожей части текста, получения % схожести?

Это сообщение отредактировал(а) Egeni - 17.6.2010, 09:38
PM MAIL   Вверх
mr.Anderson
Дата 17.6.2010, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Egeni, для начала реально основу надо сделать, проверить ее, а потом уже заниматься навесками.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
mr.Anderson
Дата 18.6.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Так, пока есть некоторые наработки, но столкнулся с трудностями. Я решил делать выполнение операций в отдельных потоках через асинхронные вызовы, что позволит спокойно запускать сколько угодно операций "одновременно". Только вот как такие потоки приостанавливать, это вопрос. Работаю над этим.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Rohoss
Дата 18.6.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(mr.Anderson @  18.6.2010,  17:27 Найти цитируемый пост)
 Я решил делать выполнение операций в отдельных потоках через асинхронные вызовы, что позволит спокойно запускать сколько угодно операций "одновременно".

mr.Anderson, не совсем понял, а зачем несколько потоков внутри FileManager? Мне казалось ему достаточно выполнять одну операцию за раз. Ведь, FileManager будет выполнять одну задачу, созданную пользователем. Если будет вторая задача, будет создан второй экземпляр FileManagerа. Или ты хочешь все задачи возложить на один экземпляр FileManagerа?


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
mr.Anderson
Дата 18.6.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Rohoss, думаю, как раз на один экземпляр файлменеджера, чего плодить объекты класса-то.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Rohoss
  Дата 18.6.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(mr.Anderson @  18.6.2010,  18:15 Найти цитируемый пост)
Rohoss, думаю, как раз на один экземпляр файлменеджера, чего плодить объекты класса-то.


mr.Anderson, ничего страшного в создании лишнего объекта в .net нет. Тем более, их будет не 100500, а в среднем меньше 10. И росчитано то по другому уже.

Вот смотри, пользователь перетаскивает перетаскивает мышкой файли и/или директории. Появляются диалоги подтверждения. Если всё ок, тогда на форме Actionwindow создаётся юзерконтрол, отображающий прогресс и создаётся экземпляр ФайлМанагера. Соответственно, юзерконтол держит ссылку на экземпляр ФайлМанагера и подписывается на его события, чтобы отображать прогресс операции тд... А также, он управляет этим екземпляром через методы Pause, Abort и другие. А начинает операции с метода Start. Вообще, после начала операций метод Start вызвать нельзя, получим исключение. А по завершению операций экземпляр ФайлМанагера будет уничтожен вместе с юзерконтрол.

Если пользователь перетаскивает второй раз файли и/или директории, всё тоже самое. Создаётся новый юзерконтрол с экземпляром ФайлМанагера.

Добавлено через 5 минут и 38 секунд
И пару поправок, к классу FileManager
Метод Suspend переименуем в Renew
Свойство RewriteMay переименуем в RewriteWay
Я в первом посте исправил  smile 



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Rohoss
  Дата 18.6.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(Rohoss @  18.6.2010,  18:44 Найти цитируемый пост)
Если всё ок, тогда на форме Actionwindow создаётся юзерконтрол, отображающий прогресс и создаётся экземпляр ФайлМанагера.

а вот он уже будет вызывать методы ФайлМанагера в другом потоке... Ну это уже его задача...


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
mr.Anderson
Дата 18.6.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Любопытно. Ну, раз ты хочешь сделать так, так и сделаем, проще будет.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Rohoss
  Дата 18.6.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


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

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



Цитата(mr.Anderson @  18.6.2010,  19:40 Найти цитируемый пост)
Ну, раз ты хочешь сделать так, так и сделаем

тем более ActiveWinwdow спроектировано под такую реализацию...

Это сообщение отредактировал(а) Rohoss - 18.6.2010, 20:20


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
mr.Anderson
Дата 22.6.2010, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Поясни, что хотелось бы видеть в работе TotalProgressChanged события, когда меняется общий прогресс. Если отталкиваться от сказанного тобой выше, то каждый такой класс - это отдельная операция, значит, каждый класс в отдельности не знает об общем прогрессе. Если он должен знать, то как ты хотел бы видеть этот процесс "узнавания" и управления этим внешним тотальным прогрессом?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка | Следующая тема »


 




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


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

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