private void HandleRenameFiles(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgszMkOldNames, string[] rgszMkNewNames, FileRenamedEventHandler csFileEvent, FileRenamedEventHandler templateEvent)
        {
            if (csFileEvent == null && templateEvent == null)
            {
                return;
            }

            var oldPaths = ExtractPath(cProjects, cFiles, rgpProjects, rgFirstIndices, rgszMkOldNames).ToArray();
            var newPaths = ExtractPath(cProjects, cFiles, rgpProjects, rgFirstIndices, rgszMkNewNames).ToArray();

            var templates = ImmutableArray.CreateBuilder <int>();
            var csFiles   = ImmutableArray.CreateBuilder <int>(cFiles);


            for (var i = 0; i < oldPaths.Length; i++)
            {
                var oldPath = oldPaths[i];

                if (oldPath.EndsWith(Constants.CsExtension, StringComparison.InvariantCultureIgnoreCase))
                {
                    csFiles.Add(i);
                }
                else if (oldPath.EndsWith(Constants.TemplateExtension, StringComparison.InvariantCultureIgnoreCase))
                {
                    templates.Add(i);
                }
            }

            if (csFileEvent != null && csFiles.Count > 0)
            {
                csFileEvent(this, new FileRenamedEventArgs(csFiles.Select(i => oldPaths[i]).ToArray(), csFiles.Select(i => newPaths[i]).ToArray()));
            }
            if (templateEvent != null && templates.Count > 0)
            {
                templateEvent(this, new FileRenamedEventArgs(templates.Select(i => oldPaths[i]).ToArray(), templates.Select(i => newPaths[i]).ToArray()));
            }
        }
        private void HandleRenameFiles(int cProjects, int cFiles, IVsProject[] rgpProjects, int[] rgFirstIndices, string[] rgszMkOldNames, string[] rgszMkNewNames, FileRenamedEventHandler csFileEvent, FileRenamedEventHandler templateEvent)
        {
            if (csFileEvent == null && templateEvent == null)
            {
                return;
            }

            var oldPaths = ExtractPath(cProjects, cFiles, rgpProjects, rgFirstIndices, rgszMkOldNames).ToArray();
            var newPaths = ExtractPath(cProjects, cFiles, rgpProjects, rgFirstIndices, rgszMkNewNames).ToArray();

            var templates = ImmutableArray.CreateBuilder<int>();
            var csFiles = ImmutableArray.CreateBuilder<int>(cFiles);

            for (var i = 0; i < oldPaths.Length; i++)
            {
                var oldPath = oldPaths[i];

                if (oldPath.EndsWith(Constants.CsExtension, StringComparison.InvariantCultureIgnoreCase))
                {
                    csFiles.Add(i);
                }
                else if (oldPath.EndsWith(Constants.TemplateExtension, StringComparison.InvariantCultureIgnoreCase))
                {
                    templates.Add(i);
                }
            }

            if (csFileEvent != null && csFiles.Count > 0)
            {
                csFileEvent(this, new FileRenamedEventArgs(csFiles.Select(i => oldPaths[i]).ToArray(), csFiles.Select(i => newPaths[i]).ToArray()));
            }
            if (templateEvent != null && templates.Count > 0)
            {
                templateEvent(this, new FileRenamedEventArgs(templates.Select(i => oldPaths[i]).ToArray(), templates.Select(i => newPaths[i]).ToArray()));
            }
        }
        private void Dispose(bool disposeManagedResources)
        {
            if (!disposeManagedResources) return;
            var disposedAlready = Interlocked.Exchange(ref _alreadyDisposed, 1);
            if (disposedAlready != 0)
            {
                return;
            }

            // Dispose managed resources.

            _fileSystemWatcher.Changed -= _fileSystemWatcherChangedEvent;
            _fileSystemWatcher.Created -= _fileSystemWatcherCreatedEvent;
            _fileSystemWatcher.Deleted -= _fileSystemWatcherDeletedEvent;
            _fileSystemWatcher.Renamed -= _fileSystemWatcherRenamedEvent;

            _fileSystemWatcher.Dispose();

            _fileChangedEvent = null;
            _fileCreatedEvent = null;
            _fileDeletedEvent = null;
            _fileRenamedEvent = null;
            _fileFinishedChangingEvent = null;
            // Dispose unmanaged resources.

            // If it is available, make the call to the
            // base class's Dispose(Boolean) method
        }