예제 #1
0
        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();
                }
            }
        }
예제 #2
0
        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);
            }
        }