Можно ли так использовать FileSystemWatcher ?
От: ExtraLamer  
Дата: 27.07.07 21:16
Оценка:
Стоит задача мониторинга обращения к файлу.
Т.е. например если кто-то просто прочитал его, не писал в него, не удалял, не etc, а просто обратился и прочитал.

Это вообще возможно c использованием FileSystemWatcher?
Re: Можно ли так использовать FileSystemWatcher ?
От: GarryIV  
Дата: 27.07.07 21:46
Оценка:
Здравствуйте, ExtraLamer, Вы писали:

EL>Стоит задача мониторинга обращения к файлу.

EL>Т.е. например если кто-то просто прочитал его, не писал в него, не удалял, не etc, а просто обратился и прочитал.

EL>Это вообще возможно c использованием FileSystemWatcher?


По моему FM однозначно высказывается на эту тему changed, created, deleted, renamed — все что отслеживает FileSystemWatcher.
WBR, Igor Evgrafov
Re[2]: Можно ли так использовать FileSystemWatcher ?
От: ExtraLamer  
Дата: 28.07.07 05:49
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>По моему FM однозначно высказывается на эту тему changed, created, deleted, renamed — все что отслеживает FileSystemWatcher.


Да я вот тоже почитал, и других событий не нашел, но думал что может что-то пропустил

В это ввобще как то возможно сделать.
Re[3]: Можно ли так использовать FileSystemWatcher ?
От: Аноним  
Дата: 28.07.07 15:10
Оценка:
EL>В это ввобще как то возможно сделать.

А я вот всё жду, когда же вы включите мозг и научитесь читать доку
Смотрим доку по FileSystemWatcher:

Событие Changed возникает при изменении размера, системных атрибутов, времени последнего доступа или разрешений безопасности файла или папки в контролируемом пути.


Когда происходит доступ к файлу (просто открытие по CreateFile(), например), обновляется дата последнего доступа — last access time. Т.о. сие со 100% гарантией возможно отследить на файлухе FAT. Однако для NTFS файлухе это не будет работать, если друг юзверь выключит параметр "Обновлять время последнего доступа при чтении содержимого каталога на файловой системе NTFS" (по умолчанию параметр включён).
Re[4]: Можно ли так использовать FileSystemWatcher ?
От: Alfaqwe  
Дата: 28.07.07 21:24
Оценка:
Здравствуйте, Аноним, Вы писали:

EL>>В это ввобще как то возможно сделать.


А>А я вот всё жду, когда же вы включите мозг и научитесь читать доку

А>Смотрим доку по FileSystemWatcher:

А>

А>Событие Changed возникает при изменении размера, системных атрибутов, времени последнего доступа или разрешений безопасности файла или папки в контролируемом пути.


А>Когда происходит доступ к файлу (просто открытие по CreateFile(), например), обновляется дата последнего доступа — last access time. Т.о. сие со 100% гарантией возможно отследить на файлухе FAT. Однако для NTFS файлухе это не будет работать, если друг юзверь выключит параметр "Обновлять время последнего доступа при чтении содержимого каталога на файловой системе NTFS" (по умолчанию параметр включён).


смотрю свойства файла в проводнике в Фат32, есть только дата, а времени нет.
файл пробный открываю OnChanged не срабатывает, срабатывает только если размер меняется.



using System;
using System.IO;

namespace Utils
{
    /// <summary>
    ///        arguments sent through when an event is fired
    /// </summary>
    public class FileWatcherEventArgs : EventArgs
    {
        private string mFileName = "";
        public string mPath = "";
        private string mOldPath = "";
        private string mOldName = "";
        private FileWatcher.fileWatcherChangeType mChangeType;

        public FileWatcherEventArgs(string fileName, string path, string oldPath, string oldName, FileWatcher.fileWatcherChangeType changeType)
        {
            mFileName = fileName;
            mPath = path;
            mOldName = oldName;
            mOldPath = oldPath;
            mChangeType = changeType;
        }

        public string FileName 
        {
            get 
            {
                return mFileName;
            }
        }
        public string OldFileName 
        {
            get 
            {
                return mOldName;
            }
        }
        public string Path 
        {
            get 
            {
                return mPath;
            }
        }
        public string OldPath 
        {
            get 
            {
                return mOldPath;
            }
        }

        public FileWatcher.fileWatcherChangeType ChangeType
        {
            get 
            {
                return mChangeType;
            }
        }

    }

    
    /// <summary>
    /// monitors a folder for file system changes
    /// </summary>
    public class FileWatcher
    {
        #region enums, constants & fields
        public enum fileWatcherChangeType
        {
            fileAdded,
            fileDeleted,
            fileRenamed,
            filechanged
        }

        private string mPath = ".";        //path to watch
        private string mFilter = "*.*";    //filter to watch
        private FileSystemWatcher mFsw = new FileSystemWatcher();
        private string mCurrentFileName = "";
        private string mCurrentPath = "";
        private string mCurrentOldPath = "";
        private string mCurrentOldName = "";
        private fileWatcherChangeType mChangeType;
        #endregion

        #region events and delegates
        public delegate void ChangedEventHandler(object sender, FileWatcherEventArgs args);

        public event ChangedEventHandler Changed;
        #endregion

        #region constructors
        public FileWatcher()
        {
            CreateFileWatcher();
        }

        public FileWatcher(string path, string filter) : this()
        {
            mPath = path;
            mFilter = filter;
        }

        public FileWatcher(string path) : this()
        {
            mPath = path;
        }
        #endregion

        #region Properties

        public string Path
        {
            get
            {
                return mPath;
            }
            set
            {
                mPath = value;
            }
        }

        public string Filter
        {
            get
            {
                return mFilter;
            }
            set
            {
                mFilter = value;
            }
        }

        public bool isStarted
        {
            get
            {
                return mFsw.EnableRaisingEvents;
            }
        }

        public string CurrentFileName 
        {
            get 
            {
                return mCurrentFileName;
            }
        }
        public string CurrentOldFileName 
        {
            get 
            {
                return mCurrentOldName;
            }
        }
        public string CurrentPath 
        {
            get 
            {
                return mCurrentPath;
            }
        }
        public string CurrentOldPath 
        {
            get 
            {
                return mCurrentOldPath;
            }
        }

        public FileWatcher.fileWatcherChangeType CurrentChangeType
        {
            get 
            {
                return mChangeType;
            }
        }
        #endregion

        #region public methods
        /// <summary>
        /// start the watcher for a specific folder with a specific filter
        /// </summary>
        public void StartWatcher()
        {
            mFsw.Path = mPath;
            mFsw.Filter = mFilter;
            mFsw.EnableRaisingEvents = true;
        }

        /// <summary>
        ///        to stop the folder watcher from raising events
        /// </summary>
        public void StopWatcher()
        {
            mFsw.EnableRaisingEvents = false;
        }

        #endregion

        #region file watcher engine
        /// <summary>
        ///        the heart of the file watcher engine
        /// </summary>
        private void CreateFileWatcher()
        {
            mFsw = new FileSystemWatcher(mPath,mFilter);
            mFsw.NotifyFilter = NotifyFilters.LastWrite | 
                NotifyFilters.DirectoryName | NotifyFilters.FileName;
            mFsw.Changed += new FileSystemEventHandler(OnChanged);
            mFsw.Created += new FileSystemEventHandler(OnCreated);
            mFsw.Deleted += new FileSystemEventHandler(OnDeleted);
            mFsw.Renamed += new RenamedEventHandler(OnRenamed);
        }

        protected virtual void OnChanged(FileWatcherEventArgs e)
        {
            //raises the event to say that a file has changed
            Changed(this,e);
        }

        #endregion

        #region private file-change methods
        private void OnCreated(object source, FileSystemEventArgs args)
        {    
            mCurrentFileName = args.Name;
            mCurrentPath = args.FullPath;
            mCurrentOldName = "";
            mCurrentOldPath = "";
            mChangeType = fileWatcherChangeType.fileAdded;
            OnChanged(new FileWatcherEventArgs(mCurrentFileName,mCurrentPath, mCurrentOldPath,mCurrentOldName,mChangeType));
        }

        private void OnRenamed(object source, RenamedEventArgs args)
        {    
            mCurrentFileName = args.Name;
            mCurrentPath = args.FullPath;
            mCurrentOldName = args.OldFullPath;
            mCurrentOldPath = args.OldName;        
            mChangeType = fileWatcherChangeType.fileRenamed;
            OnChanged(new FileWatcherEventArgs(mCurrentFileName,mCurrentPath, mCurrentOldPath,mCurrentOldName,mChangeType));
    
        }

        private void OnDeleted(object source, FileSystemEventArgs args)
        {    
            mCurrentFileName = args.Name;
            mCurrentPath = args.FullPath;
            mCurrentOldName = "";
            mCurrentOldPath = "";
            mChangeType = fileWatcherChangeType.fileDeleted;
            OnChanged(new FileWatcherEventArgs(mCurrentFileName,mCurrentPath, mCurrentOldPath,mCurrentOldName,mChangeType));
        }

        private void OnChanged(object source, FileSystemEventArgs args)
        {    
            mCurrentFileName = args.Name;
            mCurrentPath = args.FullPath;
            mCurrentOldName = "";
            mCurrentOldPath = "";
            mChangeType = fileWatcherChangeType.filechanged;
            OnChanged(new FileWatcherEventArgs(mCurrentFileName,mCurrentPath, mCurrentOldPath,mCurrentOldName,mChangeType));
        }
        #endregion
    }
}
Re[5]: Можно ли так использовать FileSystemWatcher ?
От: Аноним  
Дата: 29.07.07 14:21
Оценка:
Здравствуйте, Alfaqwe, Вы писали:

У фата возможно нету атрибута файла LastDateAccessed
Re[6]: Можно ли так использовать FileSystemWatcher ?
От: Alfaqwe  
Дата: 29.07.07 17:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У фата возможно нету атрибута файла LastDateAccessed


отформатировал кусок винта в NTFS.

По свойству из проводника там есть кроме даты как в фат32 так ещё и время. но забавнее то что Changed кое как работает в фат32, но вообще е работает в NTFS не реагирует даже на изменение размера файла

реестр проверил:
HKEY_LOCAL_MACHINESYSTEM CurrentControlSetControlFileSystem, NtfsDisableLastAccessUpdate такого у меня нет. зато есть.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"NtfsDisable8dot3NameCreation"=dword:00000000

даже не знаю чего делать дальше
Re[7]: Можно ли так использовать FileSystemWatcher ?
От: Alfaqwe  
Дата: 29.07.07 18:14
Оценка:
Здравствуйте, Alfaqwe, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>У фата возможно нету атрибута файла LastDateAccessed


A>отформатировал кусок винта в NTFS.


A>По свойству из проводника там есть кроме даты как в фат32 так ещё и время. но забавнее то что Changed кое как работает в фат32, но вообще е работает в NTFS не реагирует даже на изменение размера файла


A>реестр проверил:

A>HKEY_LOCAL_MACHINESYSTEM CurrentControlSetControlFileSystem, NtfsDisableLastAccessUpdate такого у меня нет. зато есть.

A>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]

A>"NtfsDisable8dot3NameCreation"=dword:00000000

A>даже не знаю чего делать дальше


Более того! Windows XP2 Home/pro никак не реагирует на открытие файла и не меняет Access ;D

Висту что ли ставить
Re[8]: Можно ли так использовать FileSystemWatcher ?
От: _d_m_  
Дата: 30.07.07 05:17
Оценка:
Здравствуйте, Alfaqwe, Вы писали:

A>Более того! Windows XP2 Home/pro никак не реагирует на открытие файла и не меняет Access ;D


Скорее всего, данная функциональность отключена в реестре. Поищи в инете какой ключ за это отвечает.
Re[9]: Можно ли так использовать FileSystemWatcher ?
От: Alfaqwe  
Дата: 30.07.07 20:12
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Скорее всего, данная функциональность отключена в реестре. Поищи в инете какой ключ за это отвечает.


О ключах я писал выше.
Такого ключа вообще нет в реестре.

Дальнейшие эксперименты показали, что сам Watcher, работает как хочет. Т.е. если система сильно загружена, то при копировании 330 файлов он реагирует на только напоявление 29 а если свободна то на 180

вЕнда рулит
Re[10]: Можно ли так использовать FileSystemWatcher ?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 31.07.07 04:46
Оценка:
Здравствуйте, Alfaqwe, Вы писали:

A>вЕнда рулит


поиск тоже — Re: FileSystemWatcher
Автор: Sinclair
Дата: 26.02.07
... << RSDN@Home 1.2.0 alpha rev. 694>>
Re[10]: Можно ли так использовать FileSystemWatcher ?
От: asmodai  
Дата: 31.07.07 07:54
Оценка:
Здравствуйте, Alfaqwe, Вы писали:


A>Дальнейшие эксперименты показали, что сам Watcher, работает как хочет. Т.е. если система сильно загружена, то при копировании 330 файлов он реагирует на только напоявление 29 а если свободна то на 180


ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.en/cpref8/html/T_System_IO_FileSystemWatcher.htm

The Windows operating system notifies your component of file changes in a buffer the created by the FileSystemWatcher. If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide blanket notification. Increasing the size of the buffer with the InternalBufferSize property is expensive, as it comes from non-paged memory that cannot be swapped out to disk, so keep the buffer as small yet large enough to not miss any file change events. To avoid a buffer overflow, use the NotifyFilter, and IncludeSubdirectories properties so you can filter out unwanted change notifications.


Грубо говоря, если нет желания терять информацию об изменениях — дефолтные 8 килобайт буфера имеет смысл увеличить
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[10]: Можно ли так использовать FileSystemWatcher ?
От: ryf  
Дата: 31.07.07 08:10
Оценка:
Здравствуйте, Alfaqwe, Вы писали:

A>...

A>...

A>Дальнейшие эксперименты показали, что сам Watcher, работает как хочет. Т.е. если система сильно загружена, то при копировании 330 файлов он реагирует на только напоявление 29 а если свободна то на 180


A>...



Подпишись на событие OnError у Watcher-а

MSDN

The system notifies you of file changes, and it stores those changes in a buffer that the component creates and passes to the APIs. If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide blanket notification. Increasing the size of the buffer is expensive, as it comes from non paged memory that cannot be swapped out to disk, so keep the buffer as small as possible. To avoid a buffer overflow, use the NotifyFilter, Filter, and IncludeSubdirectories properties to filter out unwanted change notifications.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.