// private Dictionary<string,FileSystemWatcher> _directoriesFileSystemWatchers = new Dictionary<string, FileSystemWatcher>(); public DirectoryWatcher(TopViewModel top,IDirectoryViewModel root, PathHelper pathHelper, Dispatcher dispatcher) { Top = top; _pathHelper = pathHelper; _dispatcher = dispatcher; root.SubDirectories.CollectionLoaded += SubDirectories_CollectionLoaded; }
public static IDirectoryViewModel ClearNotExistDirectories(IDirectoryViewModel directory) { IDirectoryViewModel noExistDirectory = null; IDirectoryViewModel currentDirectory = directory; while (currentDirectory.Parent != null) { if (currentDirectory.Path == "" || Directory.Exists(currentDirectory.Path)) { if (noExistDirectory != null) { currentDirectory.SubDirectories.Remove(noExistDirectory); } return(currentDirectory); } DirectoryWatcher.DeleteFileSystemWatcher(currentDirectory); currentDirectory.SubDirectories.Clear(); currentDirectory.Files.Clear(); noExistDirectory = currentDirectory; currentDirectory = currentDirectory.Parent; } // only this pc if (currentDirectory.Path == "") { if (noExistDirectory != null) { currentDirectory.SubDirectories.Remove(noExistDirectory); } return(currentDirectory); } return(null); }
public IDirectoryViewModel GetDirectory(string path, out IDirectoryViewModel parent) { IDirectoryViewModel child = null; IDirectoryViewModel findedParent = null; findedParent = Root; child = findedParent; parent = null; do { findedParent = child; child = findedParent.SubDirectories.FirstOrDefault(model => Contains(NormalizePath(path), NormalizePath(model.Path))); if (child == null) { if (NormalizePath(findedParent.Path) == NormalizePath(Directory.GetParent(path).FullName)) { parent = findedParent; } return(null); } } while (NormalizePath(child.Path) != NormalizePath(path)); if (child != null) { parent = child.Parent; } return(child); }
private void AddDirectoryToWatch(IDirectoryViewModel directory) { var drive = DriveInfoEx.IsDrive(directory.Path); if (drive != null && !drive.IsReady) { return; } /* if (!drive.IsReady) return;*/ FileSystemWatcher directoryFileSystemWatcher = new FileSystemWatcher(); directoryFileSystemWatcher.Path = directory.Path; /* Watch for changes in LastAccess and LastWrite times, and * the renaming of files or directories. */ directoryFileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; // Add event handlers. directoryFileSystemWatcher.Changed += OnChanged; directoryFileSystemWatcher.Created += OnChanged; directoryFileSystemWatcher.Deleted += OnChanged; directoryFileSystemWatcher.Renamed += OnRenamed; // Begin watching. directoryFileSystemWatcher.EnableRaisingEvents = true; directory.FileSystemWatcher = directoryFileSystemWatcher; directory.SubDirectories.CollectionLoaded += SubDirectories_CollectionLoaded; }
private void OnRenamed(object source, RenamedEventArgs e) { IDirectoryViewModel parent; IDirectoryViewModel child = _pathHelper.GetDirectory(e.FullPath, out parent); bool isFile; int index = -1; isFile = Path.HasExtension(e.FullPath); if (isFile) { if (!parent.Files.IsLoaded) { return; } } else { if (!parent.SubDirectories.IsLoaded) { parent.UpdateHasItems(); return; } } _dispatcher.Invoke(() => { Delete(isFile, parent, child, e.OldFullPath); Create(isFile, parent, e.FullPath); }); }
public DirectoryViewModelBase(INativeSystemInfo nativeSystemInfo, IDirectoryViewModel parent) { NativeSystemInfo = nativeSystemInfo; Parent = parent; OpenCommand = new RelayCommand(Open); Size = -1; }
public static IDirectoryViewModel ClearNotExistDirectories(IDirectoryViewModel directory) { IDirectoryViewModel noExistDirectory = null; IDirectoryViewModel currentDirectory = directory; while (currentDirectory.Parent!=null) { if (currentDirectory.Path == "" || Directory.Exists(currentDirectory.Path)) { if (noExistDirectory != null) { currentDirectory.SubDirectories.Remove(noExistDirectory); } return currentDirectory; } DirectoryWatcher.DeleteFileSystemWatcher(currentDirectory); currentDirectory.SubDirectories.Clear(); currentDirectory.Files.Clear(); noExistDirectory = currentDirectory; currentDirectory = currentDirectory.Parent; } // only this pc if (currentDirectory.Path == "") { if (noExistDirectory != null) { currentDirectory.SubDirectories.Remove(noExistDirectory); } return currentDirectory; } return null; }
// private Dictionary<string,FileSystemWatcher> _directoriesFileSystemWatchers = new Dictionary<string, FileSystemWatcher>(); public DirectoryWatcher(TopViewModel top, IDirectoryViewModel root, PathHelper pathHelper, Dispatcher dispatcher) { Top = top; _pathHelper = pathHelper; _dispatcher = dispatcher; root.SubDirectories.CollectionLoaded += SubDirectories_CollectionLoaded; }
private async void performMove(IEntityViewModel entity, IDirectoryViewModel targetDirectory) { var targetVirtualDirectory = targetDirectory.VirtualFileSystem.GetDirectory(targetDirectory.DirectoryPath); switch (entity.Type) { case EntityType.Directory: var virtualDirectory = entity.VirtualFileSystem.GetDirectory(entity.FullName); try { await _longOperationsManager.StartLongOperation(targetDirectory.VirtualFileSystem, operation => virtualDirectory.MoveTo(targetVirtualDirectory, operation.SetState, operation.CancellationTokenSource.Token)); } catch (Exception e) { _windowsManager.ReportError("Directory move error", e); } break; case EntityType.File: var virtualFile = entity.VirtualFileSystem.GetFile(entity.FullName); try { await _longOperationsManager.StartLongOperation(targetDirectory.VirtualFileSystem, operation => virtualFile.MoveTo(targetVirtualDirectory, operation.SetState, operation.CancellationTokenSource.Token)); } catch (Exception e) { _windowsManager.ReportError("File move error", e); } break; } }
public DirectoryViewModel(DirectoryInfo directoryInfo, IDirectoryViewModel parent) : base(new NativeFileInfo(directoryInfo.FullName, true), parent) { _directoryInfo = directoryInfo; var directoryProvider = new SubDirectoriesProvider(_directoryInfo, this); Path = Environment.ExpandEnvironmentVariables(_directoryInfo.FullName); DisplayName = _directoryInfo.Name; if (Parent != null) { VisualPath = Parent.VisualPath + "\\" + DisplayName; } Files = new AsyncLoadCollection <ISystemObjectViewModel>(new FilesProvider(directoryInfo, this)); SubDirectories = new AsyncLoadCollection <IDirectoryViewModel>(directoryProvider); Children = new UnionCollectionEx <IDirectoryViewModel, ISystemObjectViewModel, ISystemObjectViewModel>(SubDirectories, Files); LastModificationDate = _directoryInfo.LastWriteTime; try { UpdateHasItems(); } catch (UnauthorizedAccessException ex) { NoAccess = true; } }
public FileViewModel(FileInfo info, IDirectoryViewModel parent) { Info = info; Parent = parent; Path = VisualPath = info.FullName; OpenCommand = new RelayCommand(() => Open()); _nativeFileInfo = new NativeFileInfo(Info.FullName); }
private void OnCurrentPathSet() { _cancellationTokenSource.Cancel(); _cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { try { var child = PathHelper.GetAndLoadDirectory(CurrentPath, _cancellationTokenSource.Token); try { child.Wait(); } catch (AggregateException ex) { if (ex.InnerExceptions.FirstOrDefault(exception => exception.GetType() == typeof(OperationCanceledException)) != null) { return; } if (!_currentPathBroken) { _currentPathBroken = true; _positionHistory--; ClearAfterPosition(); } MessageBoxService.Instance.ShowError(ex.InnerExceptions.OfType <Exception>().First().Message); return; } if (child.IsCanceled) { return; } if (child.IsFaulted) { throw child.Exception; } if (child.Result.NoAccess) { MessageBoxService.Instance.ShowError(AccessDirectoryDeniedException.Msg); return; } if (SelectedDirectory.VisualPath == child.Result.VisualPath) { return; } SelectedDirectory = child.Result; AddToHistory(CurrentPath); } catch (Exception exception) { MessageBoxService.Instance.ShowError(exception.Message); } }, _cancellationTokenSource.Token); }
private void performOperation(IEntityViewModel entity, IDirectoryViewModel targetDirectory, bool isCutOperation) { if (entity.VirtualFileSystem == targetDirectory.VirtualFileSystem) { performPaste(entity, targetDirectory, isCutOperation); return; } performImport(entity, targetDirectory); }
private void performPaste(IEntityViewModel entity, IDirectoryViewModel targetDirectory, bool isCutOperation) { if (isCutOperation) { performMove(entity, targetDirectory); return; } performCopy(entity, targetDirectory); }
private void Create(bool isFile, IDirectoryViewModel parent, string path) { int index = 0; if (isFile) { if (parent == null) { return; } if (!parent.Files.IsLoaded) { return; } string name = Path.GetFileName(path); for (int i = 0; i < parent.Files.Count; i++) { var file = parent.Files[i]; if (string.Compare(name, file.DisplayName, StringComparison.OrdinalIgnoreCase) < 0) { index = i; break; } } parent.Files.Insert(index, new FileViewModel(new FileInfo(path), parent)); } else { if (parent != null) { if (parent.SubDirectories.IsLoaded) { string name = Path.GetDirectoryName(path); for (int i = 0; i < parent.SubDirectories.Count; i++) { var directory = parent.SubDirectories[i]; if (String.Compare(name, directory.DisplayName, StringComparison.OrdinalIgnoreCase) < 0) { index = i; break; } } var newDirectory = new DirectoryViewModel(new DirectoryInfo(path), parent); parent.SubDirectories.Insert(index, newDirectory); AddDirectoryToWatch(newDirectory); } else { parent.UpdateHasItems(); } return; } } }
public static bool OnOpenDirectory(IDirectoryViewModel e) { var args = new OpenDirectoryArgs(e); if (e.Path != "" && !Directory.Exists(e.Path)) { OnNoExistDirectory(e); throw new DirectoryDoesExistException(); } OpenDirectory?.Invoke(null, args); return(args.Cancel); }
private int FindFileIndex(IDirectoryViewModel directoryViewModel, string path) { for (int i = 0; i < directoryViewModel.Files.Count; i++) { var file = directoryViewModel.Files[i]; if (file.Path == path) { return(i); } } return(-1); }
public Task <IDirectoryViewModel> GetAndLoadDirectory(string path, CancellationToken token) { return(Task.Run(() => { IDirectoryViewModel child = null; IDirectoryViewModel findedParent = null; child = Root; //check first string trimedPath = Trim(path); bool isVisualPath = Contains(trimedPath, Trim(Root.VisualPath)); while (Trim(child.VisualPath) != trimedPath) { if (!child.SubDirectories.IsLoaded) { child.SubDirectories.LoadAsync(token).Wait(token); } findedParent = child; child = findedParent.SubDirectories.FirstOrDefault(model => Contains(trimedPath, Trim(model.VisualPath))); if (child == null) { break; } /* child.IsExpanded = true;*/ } if (child != null) { return child; } if (isVisualPath || !Directory.Exists(trimedPath)) { throw new DirectoryDoesExistException(); } child = Root; while (NormalizePath(child.Path) != NormalizePath(path)) { if (!child.SubDirectories.IsLoaded) { child.SubDirectories.LoadAsync(token).Wait(token); } findedParent = child; child = findedParent.SubDirectories.First(model => Contains(NormalizePath(path), NormalizePath(model.Path))); } return child; }, token)); }
public static void DeleteFileSystemWatcher(IDirectoryViewModel directoryViewModel) { if (directoryViewModel.FileSystemWatcher != null) { directoryViewModel.FileSystemWatcher.EnableRaisingEvents = false; directoryViewModel.FileSystemWatcher.Dispose(); } if (directoryViewModel.SubDirectories.Count != 0) { foreach (var directory in directoryViewModel.SubDirectories) { DeleteFileSystemWatcher(directory); } } }
private void Create(bool isFile, IDirectoryViewModel parent, string path) { int index = 0; if (isFile) { if (parent == null) return; if (!parent.Files.IsLoaded) return; string name = Path.GetFileName(path); for (int i = 0; i < parent.Files.Count; i++) { var file = parent.Files[i]; if (string.Compare(name, file.DisplayName, StringComparison.OrdinalIgnoreCase) < 0) { index = i; break; } } parent.Files.Insert(index, new FileViewModel(new FileInfo(path), parent)); } else { if (parent != null) { if (parent.SubDirectories.IsLoaded) { string name = Path.GetDirectoryName(path); for (int i = 0; i < parent.SubDirectories.Count; i++) { var directory = parent.SubDirectories[i]; if (String.Compare(name, directory.DisplayName, StringComparison.OrdinalIgnoreCase) < 0) { index = i; break; } } var newDirectory = new DirectoryViewModel(new DirectoryInfo(path), parent); parent.SubDirectories.Insert(index, newDirectory); AddDirectoryToWatch(newDirectory); } else { parent.UpdateHasItems(); } return; } } }
private void OnChanged(object source, FileSystemEventArgs e) { try { IDirectoryViewModel parent; IDirectoryViewModel child = _pathHelper.GetDirectory(e.FullPath, out parent); bool isFile; int index = -1; isFile = Path.HasExtension(e.FullPath); _dispatcher.Invoke(() => { switch (e.ChangeType) { case WatcherChangeTypes.Created: Create(isFile, parent, e.FullPath); break; case WatcherChangeTypes.Changed: if (isFile) { index = FindFileIndex(parent, e.FullPath); if (index == -1) { return; } parent.Files[index].UpdateParameters(); } else { if (child != null) { child.UpdateParameters(); } } break; case WatcherChangeTypes.Deleted: Delete(isFile, parent, child, e.FullPath); break; } }); } catch (Exception) { } }
public RootDirectoryViewModel(NativeDirectoryInfo nativeDirectoryInfo, IDirectoryViewModel parent) : base(nativeDirectoryInfo, parent) { NativeSystemInfo = nativeDirectoryInfo; var directoryUnfo = new DirectoryInfo(nativeDirectoryInfo.Path); var subDirectoryProvider = new SubDirectoriesProvider(directoryUnfo, this); var filesProvider = new FilesProvider(directoryUnfo,this); DisplayName = nativeDirectoryInfo.DisplayName; Path = nativeDirectoryInfo.Path; VisualPath = Parent.VisualPath + "\\" + DisplayName; //is drive? DriveInfo driveInfo = Drives.FirstOrDefault(info => PathHelper.NormalizePath(info.Name) == PathHelper.NormalizePath(Path)); HasItems = driveInfo?.IsReady ?? directoryUnfo.EnumerateDirectories().Any(); SubDirectories = new AsyncLoadCollection<IDirectoryViewModel>(subDirectoryProvider); SubDirectories.CollectionChanged += _subDirectories_CollectionChanged; Files = new AsyncLoadCollection<ISystemObjectViewModel>(filesProvider); Children = new UnionCollectionEx<IDirectoryViewModel, ISystemObjectViewModel, ISystemObjectViewModel>(SubDirectories, Files); }
public RootDirectoryViewModel(NativeDirectoryInfo nativeDirectoryInfo, IDirectoryViewModel parent) : base(nativeDirectoryInfo, parent) { NativeSystemInfo = nativeDirectoryInfo; var directoryUnfo = new DirectoryInfo(nativeDirectoryInfo.Path); var subDirectoryProvider = new SubDirectoriesProvider(directoryUnfo, this); var filesProvider = new FilesProvider(directoryUnfo, this); DisplayName = nativeDirectoryInfo.DisplayName; Path = nativeDirectoryInfo.Path; VisualPath = Parent.VisualPath + "\\" + DisplayName; //is drive? DriveInfo driveInfo = Drives.FirstOrDefault(info => PathHelper.NormalizePath(info.Name) == PathHelper.NormalizePath(Path)); HasItems = driveInfo?.IsReady ?? directoryUnfo.EnumerateDirectories().Any(); SubDirectories = new AsyncLoadCollection <IDirectoryViewModel>(subDirectoryProvider); SubDirectories.CollectionChanged += _subDirectories_CollectionChanged; Files = new AsyncLoadCollection <ISystemObjectViewModel>(filesProvider); Children = new UnionCollectionEx <IDirectoryViewModel, ISystemObjectViewModel, ISystemObjectViewModel>(SubDirectories, Files); }
private void AddDirectoryToWatch(IDirectoryViewModel directory) { var drive = DriveInfoEx.IsDrive(directory.Path); if (drive != null && !drive.IsReady) return; /* if (!drive.IsReady) return;*/ FileSystemWatcher directoryFileSystemWatcher = new FileSystemWatcher(); directoryFileSystemWatcher.Path = directory.Path; /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */ directoryFileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; // Add event handlers. directoryFileSystemWatcher.Changed += OnChanged; directoryFileSystemWatcher.Created += OnChanged; directoryFileSystemWatcher.Deleted += OnChanged; directoryFileSystemWatcher.Renamed += OnRenamed; // Begin watching. directoryFileSystemWatcher.EnableRaisingEvents = true; directory.FileSystemWatcher = directoryFileSystemWatcher; directory.SubDirectories.CollectionLoaded += SubDirectories_CollectionLoaded; }
public DirectoryViewModel(DirectoryInfo directoryInfo, IDirectoryViewModel parent) : base(new NativeFileInfo(directoryInfo.FullName,true), parent) { _directoryInfo = directoryInfo; var directoryProvider = new SubDirectoriesProvider(_directoryInfo, this); Path = Environment.ExpandEnvironmentVariables(_directoryInfo.FullName); DisplayName = _directoryInfo.Name; if (Parent != null) VisualPath = Parent.VisualPath + "\\" + DisplayName; Files = new AsyncLoadCollection<ISystemObjectViewModel>(new FilesProvider(directoryInfo,this)); SubDirectories = new AsyncLoadCollection<IDirectoryViewModel>(directoryProvider); Children = new UnionCollectionEx<IDirectoryViewModel, ISystemObjectViewModel, ISystemObjectViewModel>(SubDirectories, Files); LastModificationDate = _directoryInfo.LastWriteTime; try { UpdateHasItems(); } catch (UnauthorizedAccessException ex) { NoAccess = true; } }
private void Delete(bool isFile, IDirectoryViewModel parent, IDirectoryViewModel child, string path) { int index; if (isFile) { if (parent != null) { if (parent.Files.IsLoaded) { index = FindFileIndex(parent, path); parent.Files.Remove(parent.Files[index]); } } } else { if (child == null) { if (parent != null) { parent.UpdateHasItems(); return; } return; } string selectedPathDirectory = PathHelper.NormalizePath(Top.SelectedDirectory.Path); string deletedPath = PathHelper.NormalizePath(path); if (PathHelper.Contains(selectedPathDirectory, deletedPath)) { Top.SelectedDirectory = child.Parent; } child.Parent.SubDirectories.Remove(child); DeleteFileSystemWatcher(child); } }
public void Paste(IDirectoryViewModel directory) { var entities = _clipboardData.ToList(); var isCutOperation = _isCutOperation; if (_isCutOperation) { clearClipboard();//allow continue copying as many times as user wants } _isCutOperation = false; HasItemsChanged?.Invoke(this, EventArgs.Empty); try { foreach (var entityInfo in entities) { performOperation(entityInfo, directory, isCutOperation); } } catch (Exception e) { _windowsManager.ReportError("Paste error", e); } }
public PathHelper(IDirectoryViewModel root) { Root = root; }
public static void SetSelected(DependencyObject element, IDirectoryViewModel value) { element.SetValue(SelectedProperty, value); }
public OpenDirectoryArgs(IDirectoryViewModel directory) { Directory = directory; }
public static void OnNoExistDirectory(IDirectoryViewModel directoryViewModel) { NoExistDirectory?.Invoke(null, new NoExistDirectoryArgs(directoryViewModel)); }
public NoExistDirectoryArgs(IDirectoryViewModel directory) { Directory = directory; }
private void OnCurrentPathSet() { _cancellationTokenSource.Cancel(); _cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { try { var child = PathHelper.GetAndLoadDirectory(CurrentPath, _cancellationTokenSource.Token); try { child.Wait(); } catch (AggregateException ex) { if (ex.InnerExceptions.FirstOrDefault(exception => exception.GetType() == typeof(OperationCanceledException)) != null) return; if (!_currentPathBroken) { _currentPathBroken = true; _positionHistory--; ClearAfterPosition(); } MessageBoxService.Instance.ShowError(ex.InnerExceptions.OfType<Exception>().First().Message); return; } if (child.IsCanceled) { return; } if (child.IsFaulted) throw child.Exception; if (child.Result.NoAccess) { MessageBoxService.Instance.ShowError(AccessDirectoryDeniedException.Msg); return; } if (SelectedDirectory.VisualPath == child.Result.VisualPath ) return; SelectedDirectory = child.Result; AddToHistory(CurrentPath); } catch (Exception exception) { MessageBoxService.Instance.ShowError(exception.Message); } }, _cancellationTokenSource.Token); }
public FilesProvider(DirectoryInfo directoryInfo, IDirectoryViewModel parent) { Parent = parent; _directoryInfo = directoryInfo; }
public IDirectoryViewModel GetDirectory(string path, out IDirectoryViewModel parent) { IDirectoryViewModel child = null; IDirectoryViewModel findedParent = null; findedParent = Root; child = findedParent; parent = null; do { findedParent = child; child = findedParent.SubDirectories.FirstOrDefault(model => Contains(NormalizePath(path), NormalizePath(model.Path))); if (child == null) { if (NormalizePath(findedParent.Path) == NormalizePath(Directory.GetParent(path).FullName)) { parent = findedParent; } return null; } } while (NormalizePath(child.Path) != NormalizePath(path)); if (child != null) { parent = child.Parent; } return child; }
private void DirectoryViewModelBase_OpenDirectory(object sender, DirectoryViewModelBase.OpenDirectoryArgs e) { SelectedDirectory = e.Directory; }
public static bool OnOpenDirectory(IDirectoryViewModel e) { var args = new OpenDirectoryArgs(e); if (e.Path != "" && !Directory.Exists(e.Path)) { OnNoExistDirectory(e); throw new DirectoryDoesExistException(); } OpenDirectory?.Invoke(null, args); return args.Cancel; }
private int FindFileIndex(IDirectoryViewModel directoryViewModel, string path) { for (int i = 0; i < directoryViewModel.Files.Count; i++) { var file = directoryViewModel.Files[i]; if (file.Path == path) { return i; } } return -1; }