private void SyncDirectory(DirectoryInfo localDir, ListCloudDirectoryResult remoteDir, CancellationToken cancelToken) { this.ProgressBar_CurrentDirectory .InvokeSafe(pb => pb.Value = 0); var wait = true; var syncCtx = remoteDir.SyncWithLocalDirectory(localDir, recursive: false, autostart: false); syncCtx.Started += (sender, e) => { wait = false; }; syncCtx.SyncProgress += (sender, e) => { var labelTxt = e.StatusText ?? string.Empty; this.Label_CurrentDirectory .InvokeSafe((lbl, lblState) => { lbl.Text = lblState.Text; lblState.ToolTip.SetToolTip(lbl, lblState.Text); }, new { Text = labelTxt, ToolTip = this.ToolTip_Label_CurrentDirectory, }); this.ProgressBar_CurrentDirectory .InvokeSafe((pb, lblState) => { var percentage = 0; if (lblState.EventArguments.Progress.HasValue) { percentage = (int)Math.Floor(lblState.EventArguments.Progress.Value * 100); } if (percentage < 0) { percentage = 0; } else if (percentage > 100) { percentage = 100; } pb.Value = percentage; }, new { EventArguments = e, }); }; var task = new Task((state) => { try { var ctx = (ISyncWithLocalDirectoryExecutionContext)state; ctx.Start(); } finally { wait = false; } }, state: syncCtx , creationOptions: TaskCreationOptions.LongRunning); task.Start(); // wait until sync process has been started while (wait) { } while (syncCtx.IsRunning) { if (cancelToken.IsCancellationRequested) { syncCtx.CancelAndWait(); } } }
private void LoadRemoteDirectory(ListCloudDirectoryResult result) { try { this.ListView_RemoteFiles .InvokeSafe((lv, state) => { lv.Items.Clear(); if (state.Directory.IsRootDirectory == false) { // parent directory var newLvi = new ListViewItem(); newLvi.Tag = state.Directory; newLvi.Text = ".."; lv.Items.Add(newLvi); } // sub directories foreach (var dir in state.Directory .Directories .ToEnumerableSafe(ofType: true) .OrderBy(d => d.Name, StringComparer.InvariantCultureIgnoreCase)) { var newLvi = new ListViewItem(); newLvi.ImageIndex = 1; newLvi.Tag = dir; newLvi.Text = dir.Name ?? string.Empty; newLvi.SubItems.Add("<DIR>"); // size if (dir.WriteTime.HasValue) { newLvi.SubItems.Add(dir.WriteTime.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")); } lv.Items.Add(newLvi); } // files var fileItems = new List <ListViewItem>(); foreach (var file in state.Directory .Files .ToEnumerableSafe(ofType: true) .OrderBy(d => d.Name, StringComparer.InvariantCultureIgnoreCase)) { var newLvi = new ListViewItem(); newLvi.ImageIndex = 0; newLvi.Tag = file; newLvi.Text = file.Name ?? string.Empty; if (file.Size.HasValue) { newLvi.SubItems.Add(MakeFileSizeHumanReadable(file.Size)); } if (file.WriteTime.HasValue) { newLvi.SubItems.Add(file.WriteTime.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")); } lv.Items.Add(newLvi); fileItems.Add(newLvi); } // collect available file extensions var extensions = fileItems.Select(i => (CloudFile)i.Tag) .Select(f => { try { return(Path.GetExtension(f.Name).ToLower().Trim()); } catch { return(null); } }).Where(e => string.IsNullOrWhiteSpace(e) == false) .Distinct(); // remove old icons const int MIN_IMAGE_COUNT = 2; while (state.ImageList.Images.Count > MIN_IMAGE_COUNT) { using (var img = state.ImageList.Images[MIN_IMAGE_COUNT]) { state.ImageList.Images.RemoveAt(MIN_IMAGE_COUNT); } } // load and set icons for entries var allIcons = RegisteredFileType.GetFileTypeAndIcon(); foreach (var ext in extensions) { try { var iconFile = (string)allIcons[ext]; if (string.IsNullOrWhiteSpace(iconFile) == false) { var icon = RegisteredFileType.ExtractIconFromFile(iconFile, false); if (icon != null) { var matchingItems = fileItems.Where(i => { var f = (CloudFile)i.Tag; return((f.Name ?? string.Empty).ToLower() .Trim() .EndsWith(ext)); }); state.ImageList.Images.Add(icon); foreach (var mi in matchingItems) { mi.ImageIndex = state.ImageList.Images.Count - 1; } } } } catch { // ignore here } } }, new { Directory = result, ImageList = this.ImageList_RemoteFiles, }); } catch (Exception ex) { this.ShowErrorMessage(ex); } }