示例#1
0
        public void EvalWatchd(RCRunner runner, RCClosure closure, RCString left, RCString right)
        {
            long handle = Interlocked.Increment(ref _handle);
            RCLFileSystemWatcher watcher = new RCLFileSystemWatcher(runner, handle, right[0], left[0]);

            watcher.InternalBufferSize    = 16 * 1024;
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter          = NotifyFilters.DirectoryName |
                                            NotifyFilters.FileName |
                                            NotifyFilters.CreationTime |
                                            NotifyFilters.Attributes |
                                            NotifyFilters.LastWrite |
                                            NotifyFilters.Size;
            watcher.Created            += watcher_Created;
            watcher.Changed            += watcher_Changed;
            watcher.Deleted            += watcher_Deleted;
            watcher.Renamed            += watcher_Renamed;
            watcher.EnableRaisingEvents = true;
            lock (_lock)
            {
                _output.Add(handle, new Queue <RCBlock> ());
                _watchers.Add(handle, watcher);
            }
            runner.Yield(closure, new RCLong(handle));
        }
示例#2
0
        void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            RCLFileSystemWatcher watcher = (RCLFileSystemWatcher)sender;
            RCBlock result = GetFileEventInfo(e);

            EnqueueAndDrain(watcher, result);
        }
示例#3
0
        void watcher_Renamed(object sender, RenamedEventArgs e)
        {
            RCLFileSystemWatcher watcher = (RCLFileSystemWatcher)sender;
            RCBlock result = GetFileEventInfo(e);

            result = new RCBlock(result, "oldname", ":", new RCString(e.OldName));
            result = new RCBlock(result, "oldfullpath", ":", new RCString(e.OldFullPath));
            // RCSystem.Log.Record (watcher.Runner, closure, "fs", watcher.Handle, "rename",
            // result);
            EnqueueAndDrain(watcher, result);
        }
示例#4
0
        void Drain(RCLFileSystemWatcher watcher, RCClosure closure, Queue <RCBlock> queue)
        {
            RCBlock result = RCBlock.Empty;

            while (queue.Count > 0)
            {
                result = new RCBlock(result, "", ":", queue.Dequeue());
            }
            if (result.Count > 0)
            {
                _waiters.Remove(watcher.Handle);
                watcher.Runner.Yield(closure, result);
            }
        }
示例#5
0
 void EnqueueAndDrain(RCLFileSystemWatcher watcher, RCBlock result)
 {
     lock (_lock)
     {
         _output[watcher.Handle].Enqueue(result);
         RCClosure closure;
         if (_waiters.TryGetValue(watcher.Handle, out closure))
         {
             Queue <RCBlock> queue;
             if (_output.TryGetValue(watcher.Handle, out queue))
             {
                 Drain(watcher, closure, queue);
             }
         }
     }
 }