public USBControl() { InitializeComponent(); ThisPage = this; InitializeTreeView(); Nav.Navigate(typeof(USBFilePresenter), Nav, new DrillInNavigationTransitionInfo()); FolderTracker = new FileSystemTracker(FolderTree.RootNodes.FirstOrDefault()); FolderTracker.Created += FolderTracker_Created; FolderTracker.Deleted += FolderTracker_Deleted; FolderTracker.Renamed += FolderTracker_Renamed; Application.Current.Suspending += Current_Suspending; Loaded += USBControl_Loaded; }
private void Current_Suspending(object sender, Windows.ApplicationModel.SuspendingEventArgs e) { if (FileTracker != null) { FileTracker.Created -= FileTracker_Created; FileTracker.Deleted -= FileTracker_Deleted; FileTracker.Renamed -= FileTracker_Renamed; FileTracker.Dispose(); FileTracker = null; } if (FolderTracker != null) { FolderTracker.Created -= FolderTracker_Created; FolderTracker.Deleted -= FolderTracker_Deleted; FolderTracker.Renamed -= FolderTracker_Renamed; FolderTracker.Dispose(); FolderTracker = null; } }
public FolderService() { this.Files = new ConcurrentDictionary<string, FileData>(StringComparer.InvariantCultureIgnoreCase); this.Tree = new SortedObservableCollection<FileData>(FileData.Comparer); this._tracker = new FileSystemTracker(this.Tree, this._files); }
public FolderService() { this.Files = new ConcurrentDictionary <string, FileData>(StringComparer.InvariantCultureIgnoreCase); this.Tree = new SortedObservableCollection <FileData>(FileData.Comparer); this._tracker = new FileSystemTracker(this.Tree, this._files); }
private async void FileTree_ItemInvoked(TreeView sender, TreeViewItemInvokedEventArgs args) { /* * 同一文件夹内可能存在大量文件 * 因此切换不同文件夹时极有可能遍历文件夹仍未完成 * 此处激活取消指令,等待当前遍历结束,再开始下一次文件遍历 * 确保不会出现异常 */ //防止多次点击同一文件夹导致的多重查找 if ((args.InvokedItem as TreeViewNode).Content is StorageFolder folder) { if (folder.FolderRelativeId == CurrentFolder?.FolderRelativeId) { IsAdding = false; return; } if (IsAdding) { await Task.Run(() => { lock (SyncRootProvider.SyncRoot) { CancelToken.Cancel(); Locker.WaitOne(); } }); } IsAdding = true; CurrentFolder = folder; CurrentNode = args.InvokedItem as TreeViewNode; USBFilePresenter.ThisPage.DisplayNode = CurrentNode; //当处于USB其他附加功能的页面时,若点击文件目录则自动执行返回导航 if (Nav.CurrentSourcePageType.Name != "USBFilePresenter") { Nav.GoBack(); } USBFilePresenter.ThisPage.FileCollection.Clear(); QueryOptions Options = new QueryOptions(CommonFileQuery.DefaultQuery, null) { FolderDepth = FolderDepth.Shallow, IndexerOption = IndexerOption.UseIndexerWhenAvailable }; Options.SetThumbnailPrefetch(ThumbnailMode.ListView, 60, ThumbnailOptions.ResizeThumbnail); var FileQuery = folder.CreateFileQueryWithOptions(Options); var FileList = await FileQuery.GetFilesAsync(); USBFilePresenter.ThisPage.HasFile.Visibility = FileList.Count == 0 ? Visibility.Visible : Visibility.Collapsed; if (FileTracker != null) { FileTracker.Created -= FileTracker_Created; FileTracker.Deleted -= FileTracker_Deleted; FileTracker.Renamed -= FileTracker_Renamed; FileTracker.Dispose(); FileTracker = null; } FileTracker = new FileSystemTracker(FileQuery); FileTracker.Created += FileTracker_Created; FileTracker.Deleted += FileTracker_Deleted; FileTracker.Renamed += FileTracker_Renamed; foreach (var file in FileList) { if (CancelToken.IsCancellationRequested) { goto FLAG; } USBFilePresenter.ThisPage.FileCollection.Add(new RemovableDeviceFile(file)); } } FLAG: if (CancelToken.IsCancellationRequested) { CancelToken.Dispose(); CancelToken = new CancellationTokenSource(); Locker.Set(); } else { IsAdding = false; } }