Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Событие копирования файла/директории


Автор: Dogevec 15.12.2011, 11:04
Отслеживаю изменения в контролируемой директории при помощи FileSystemWatcher. При создании, изменении, переимонвании и удалении файлов/поддиректорий в контролируемой директории, всё хорошо, приходит по одному сообщению. Но при копировании файла в контролируемую директорию приходит сообщении о создании файла/директории, а так же 1-2 сообщения о его изменении. Как избежать этого? Дело в FileSystemWatcher или это примудрости самой OS Windows ?


Код создания класса FileSystemWatcher :
Код

private int CreateWatcher(string path, FileSystemWatcher wc)
        {
            // Create a new FileSystemWatcher and set its properties.
            if (string.IsNullOrEmpty(path))
                return 0;

            wc = new FileSystemWatcher();
            wc.Path = path;

            // Watch both files and subdirectories.
            wc.IncludeSubdirectories = true;

            // Watch for all changes specified in the NotifyFilters enumeration.
            wc.NotifyFilter = NotifyFilters.Attributes |
                                    NotifyFilters.CreationTime |
                                    NotifyFilters.DirectoryName |
                                    NotifyFilters.FileName |
                                    NotifyFilters.LastAccess |
                                    NotifyFilters.LastWrite |
                                    NotifyFilters.Security |
                                    NotifyFilters.Size;

            // Watch all files.
            wc.Filter = "*.*";

            // Add event handlers.
            wc.Changed += new FileSystemEventHandler(OnChanged);
            wc.Created += new FileSystemEventHandler(OnCreated);
            wc.Deleted += new FileSystemEventHandler(OnDeleted);
            wc.Error += new ErrorEventHandler(OnError);
            wc.Renamed += new RenamedEventHandler(OnRenamed);

            //Start monitoring.
            wc.EnableRaisingEvents = true;

            return 1;
        }

Автор: RastaDja 15.12.2011, 11:13
скорее всего это Windows, так как для того чтоб скопировать файл, нужно сначала создать другой файл, в который записать содержимое исходного  файла. Тоже самое и с папкой. Кстати, если Вы копируете папку, например, с 2-мя, 3-мя, n, подпапками, у вас возникает 2, 3, и N событий создания папки?

Автор: Dogevec 15.12.2011, 11:21
Только что проверил. Да, при копировании приходят сообщения о создании всех вложенных папках и файлах.

Добавлено через 1 минуту и 25 секунд
То есть, как я понимаю, в директории, куда копируется файл, создаётся темповкий файл и целевой файл. Затем данные заносяттся в темповский, а из него уже копируются в целевой?

Автор: RastaDja 15.12.2011, 11:26
Цитата(Dogevec @  15.12.2011,  12:04 Найти цитируемый пост)
Как избежать этого?

Видимо никак, все работает правильно. 
А зачем вам этого избегать, для чего вам это надо? Все зависит от задачи...

Автор: Dogevec 15.12.2011, 11:31
Необходимо мониторить изменения в расшаренной директории, и отправлять отчёт об этом на почту(список изменений за установленный интервал). И получается, что приходят два сообщения, о создании и изменении файла при копировании, что будет приводить просто к путанице в общем списке производимых операций...

Автор: RastaDja 15.12.2011, 12:10
Относительно расшаренной директории, все происходит правильно, к томуже Вы не знаете, из какой папки производится копирование. Для отчета о копировани нужно знать папку источник и приемник (иначе как писать отчет? нужно что-то типа - скопировано от туда-то вот это, вот сюда. ). Приемник известен, а источник - видимо нет. Поэтому относительно расшареной папки (как и относительно любой) есть только операция создания и изменения.
  А если у вас есть возможность получить папку источник, тогда просто считаете число вложеных файлов, и при копировании оно должно быть равным числу происходящих событий. Когда все события произошли, пишите в отчет.

Автор: RastaDja 15.12.2011, 14:47
Цитата(Dogevec @  15.12.2011,  12:21 Найти цитируемый пост)
То есть, как я понимаю, в директории, куда копируется  файл, создаётся темповкий файл и целевой файл. Затем данные заносяттся в темповский, а из него уже копируются в целевой? 

   Нет, создается только целевой (событие Created) (в чем смысл темп файла?) и в него записываются данные ресурса (событие Changed).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)