123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- /*
- Copyright (c) 2009, Adobe Systems Incorporated
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of Adobe Systems Incorporated nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package com.adobe.air.filesystem
- {
- import flash.filesystem.File;
- import flash.utils.Timer;
- import flash.events.TimerEvent;
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import com.adobe.air.filesystem.events.FileMonitorEvent;
- /*
- Todo:
-
- -Cmonitor changes in multiple attributes
- -add support for monitoring multiple files
- */
-
- /**
- * Dispatched when the modified date of the file being modified changes.
- *
- * @eventType com.adobe.air.filesystem.events.FileMonitor.CHANGE
- */
- [Event(name="CHANGE", type="com.adobe.air.filesystem.events.FileMonitor")]
- /**
- * Dispatched when the file being monitored is moved or deleted. The file
- * will be unwatched.
- *
- * @eventType com.adobe.air.filesystem.events.FileMonitor.MOVE
- */
- [Event(name="MOVE", type="com.adobe.air.filesystem.events.FileMonitor")]
-
- /**
- * Dispatched when the file being monitored is created.
- *
- * @eventType com.adobe.air.filesystem.events.FileMonitor.CREATE
- */
- [Event(name="CREATE", type="com.adobe.air.filesystem.events.FileMonitor")]
-
- /**
- * Class that monitors files for changes.
- */
- public class FileMonitor extends EventDispatcher
- {
- private var _file:File;
- private var timer:Timer;
- public static const DEFAULT_MONITOR_INTERVAL:Number = 1000;
- private var _interval:Number;
- private var fileExists:Boolean = false;
-
- private var lastModifiedTime:Number;
-
- /**
- * Constructor
- *
- * @parameter file The File that will be monitored for changes.
- *
- * @param interval How often in milliseconds the file is polled for
- * change events. Default value is 1000, minimum value is 1000
- */
- public function FileMonitor(file:File = null, interval:Number = -1)
- {
- this.file = file;
-
- if(interval != -1)
- {
- if(interval < 1000)
- {
- _interval = 1000;
- }
- else
- {
- _interval = interval;
- }
- }
- else
- {
- _interval = DEFAULT_MONITOR_INTERVAL;
- }
- }
-
- /**
- * File being monitored for changes.
- *
- * Setting the property will result in unwatch() being called.
- */
- public function get file():File
- {
- return _file;
- }
-
- public function set file(file:File):void
- {
- if(timer && timer.running)
- {
- unwatch();
- }
-
- _file = file;
-
- if(!_file)
- {
- fileExists = false;
- return;
- }
- //note : this will throw an error if new File() is passed in.
- fileExists = _file.exists;
- if(fileExists)
- {
- lastModifiedTime = _file.modificationDate.getTime();
- }
- }
-
- /**
- * How often the system is polled for Volume change events.
- */
- public function get interval():Number
- {
- return _interval;
- }
-
- /**
- * Begins monitoring the specified file for changes.
- *
- * Broadcasts Event.CHANGE event when the file's modification date has changed.
- */
- public function watch():void
- {
- if(!file)
- {
- //should we throw an error?
- return;
- }
-
- if(timer && timer.running)
- {
- return;
- }
-
- //check and see if timer is active. if it is, return
- if(!timer)
- {
- timer = new Timer(_interval);
- timer.addEventListener(TimerEvent.TIMER, onTimerEvent, false, 0, true);
- }
-
- timer.start();
- }
-
- /**
- * Stops watching the specified file for changes.
- */
- public function unwatch():void
- {
- if(!timer)
- {
- return;
- }
-
- timer.stop();
- timer.removeEventListener(TimerEvent.TIMER, onTimerEvent);
- }
-
- private function onTimerEvent(e:TimerEvent):void
- {
- var outEvent:FileMonitorEvent;
-
- if(fileExists != _file.exists)
- {
- if(_file.exists)
- {
- //file was created
- outEvent = new FileMonitorEvent(FileMonitorEvent.CREATE);
- lastModifiedTime = _file.modificationDate.getTime();
- }
- else
- {
- //file was moved / deleted
- outEvent = new FileMonitorEvent(FileMonitorEvent.MOVE);
- unwatch();
- }
- fileExists = _file.exists;
- }
- else
- {
- if(!_file.exists)
- {
- return;
- }
-
- var modifiedTime:Number = _file.modificationDate.getTime();
-
- if(modifiedTime == lastModifiedTime)
- {
- return;
- }
-
- lastModifiedTime = modifiedTime;
-
- //file modified
- outEvent = new FileMonitorEvent(FileMonitorEvent.CHANGE);
- }
-
- if(outEvent)
- {
- outEvent.file = _file;
- dispatchEvent(outEvent);
- }
- }
- }
- }
|