void IAction.CopyFileItem(ProgressInfo progressInfo)
        {
            string fileName        = System.IO.Path.Combine(target.FullName, child.FileName);
            bool   duplicateFile   = File.Exists(fileName);
            bool   hashcodeMatches = duplicateFile ? Utility.GetMD5HashFromFile(fileName).Equals(child.Hash) : false;

            if (duplicateFile && actionType == ActionType.None)
            {
                throw new IOException("File already exist");
            }
            else if (!duplicateFile || actionType == ActionType.Force || (actionType == ActionType.Sync && !hashcodeMatches))
            {
                using (var fileStream = new FileStream(fileName, actionType == ActionType.Force || actionType == ActionType.Sync ? FileMode.Create : FileMode.CreateNew))
                {
                    var downloader = client.GetAsyncFileDownloader(child);

                    progressInfo.ProgressTotal(progressInfo.FileIndex, child.FileSizeBytes.GetValueOrDefault());

                    downloader.OnTransferProgress =
                        (sender, args) =>
                    {
                        if (args.Progress.TotalBytes > 0)
                        {
                            progressInfo.ProgressTransferred(progressInfo.FileIndex, args.Progress.BytesTransferred);
                        }
                    };

                    downloader.DownloadToAsync(fileStream).Wait();

                    fileStream.Close();
                    fileSupportDelegate(fileName);
                }
            }
        }
        void IAction.CopyFileItem(ProgressInfo progressInfo)
        {
            string fileName = System.IO.Path.Combine(target.FullName, child.FileName);
            bool duplicateFile = File.Exists(fileName);
            bool hashcodeMatches = duplicateFile ? Utility.GetMD5HashFromFile(fileName).Equals(child.Hash) : false;

            if (duplicateFile && actionType == ActionType.None)
            {
                throw new IOException("File already exist");
            }
            else if (!duplicateFile || actionType == ActionType.Force || (actionType == ActionType.Sync && !hashcodeMatches))
            {
                using (var fileStream = new FileStream(fileName, actionType == ActionType.Force || actionType == ActionType.Sync ? FileMode.Create : FileMode.CreateNew))
                {
                    var downloader = client.GetAsyncFileDownloader(child);

                    progressInfo.ProgressTotal(progressInfo.FileIndex, child.FileSizeBytes.GetValueOrDefault());

                    downloader.OnTransferProgress =
                        (sender, args) =>
                        {
                            if (args.Progress.TotalBytes > 0)
                            {
                                progressInfo.ProgressTransferred(progressInfo.FileIndex, args.Progress.BytesTransferred);
                            }
                        };

                    downloader.DownloadToAsync(fileStream).Wait();
                    
                    fileStream.Close();
                    fileSupportDelegate(fileName);
                }
            }
        }
        void IAction.CopyFileItem(ProgressInfo progressInfo)
        {
            var fileInfo = (FileInfo)child;

            Models.Item fileItem = null;
            fileName = child.Name;
            try
            {
                fileItem = client.Items.ByPath(uploadTarget.url, "/" + child.Name).Execute();
            }
            catch (ODataException e) {
                if (e.Code != System.Net.HttpStatusCode.NotFound)
                {
                    throw e;
                }
            }

            bool duplicate       = fileItem != null && fileItem is Models.File;
            bool hashcodeMatches = duplicate ? (fileItem as Models.File).Hash.Equals(Utility.GetMD5HashFromFile(child.FullName)) : false;

            if (duplicate && actionType == ActionType.None)
            {
                throw new IOException("File already exist");
            }
            else if (!duplicate || actionType == ActionType.Force || (actionType == ActionType.Sync && !hashcodeMatches))
            {
                var uploadSpec = new UploadSpecificationRequest
                {
                    CanResume   = false,
                    Details     = details,
                    FileName    = fileInfo.Name,
                    FileSize    = fileInfo.Length,
                    Method      = UploadMethod.Threaded,
                    Parent      = uploadTarget.url,
                    ThreadCount = 4,
                    Raw         = true
                };

                using (var platformFileInfo = new PlatformFileInfo(fileInfo))
                {
                    var uploader = client.GetAsyncFileUploader(uploadSpec, platformFileInfo);

                    progressInfo.ProgressTotal(progressInfo.FileIndex, fileInfo.Length);

                    uploader.OnTransferProgress =
                        (sender, args) =>
                    {
                        if (args.Progress.TotalBytes > 0)
                        {
                            progressInfo.ProgressTransferred(progressInfo.FileIndex, args.Progress.BytesTransferred);
                        }
                    };

                    Task.Run(() => uploader.UploadAsync()).Wait();
                    fileSupportDelegate(fileInfo.Name);
                }
            }
        }