示例#1
0
        /// <summary>
        /// 发出一次新的请求,把回应的主体内容保存到文件
        /// 调用此方法会触发StatusUpdate事件
        /// </summary>
        /// <param name="fileName">要保存的文件路径</param>
        /// <param name="existsAction">指定的文件存在时的选项</param>
        /// <returns>是否向目标文件写入了数据</returns>
        public bool SaveAsFile(string fileName, FileExistsAction existsAction)
        {
            byte[] data = GetBytes();
            switch (existsAction)
            {
            case FileExistsAction.Overwrite:
                using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)))
                    writer.Write(data);
                return(true);

            case FileExistsAction.Append:
                using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Append, FileAccess.Write)))
                    writer.Write(data);
                return(true);

            default:
                if (!File.Exists(fileName))
                {
                    using (
                        BinaryWriter writer =
                            new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write)))
                        writer.Write(data);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
示例#2
0
        private static RenameResult ExecuteRename(RenameInput input, FileExistsAction fileExistsAction)
        {
            var directoryPath   = Path.GetDirectoryName(input.Path);
            var newFileFullPath = Path.Combine(directoryPath, input.NewFileName);

            switch (fileExistsAction)
            {
            case FileExistsAction.Rename:
                newFileFullPath = GetNonConflictingDestinationFilePath(input.Path, newFileFullPath);
                break;

            case FileExistsAction.Overwrite:
                if (System.IO.File.Exists(newFileFullPath))
                {
                    System.IO.File.Delete(newFileFullPath);
                }
                break;

            case FileExistsAction.Throw:
                if (System.IO.File.Exists(newFileFullPath))
                {
                    throw new IOException($"File already exists {newFileFullPath}. No file renamed.");
                }
                break;
            }
            System.IO.File.Move(input.Path, newFileFullPath);
            return(new RenameResult(newFileFullPath));
        }
示例#3
0
 public bool SaveAsFile(string fileName, FileExistsAction existsAction)
 {
     byte[] bytes = this.GetBytes();
     if (existsAction != FileExistsAction.Overwrite)
     {
         if (existsAction == FileExistsAction.Append)
         {
             using (BinaryWriter writer2 = new BinaryWriter(new FileStream(fileName, FileMode.Append, FileAccess.Write)))
             {
                 writer2.Write(bytes);
             }
             return(true);
         }
         if (System.IO.File.Exists(fileName))
         {
             return(false);
         }
         using (BinaryWriter writer3 = new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write)))
         {
             writer3.Write(bytes);
         }
         return(true);
     }
     using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)))
     {
         writer.Write(bytes);
     }
     return(true);
 }
示例#4
0
        public static void STEM_Copy(string source, string destination, FileExistsAction ifExists, out string destinationFilename, int retryCount = 0, int retryDelaySeconds = 3)
        {
            if (String.IsNullOrEmpty(source))
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (String.IsNullOrEmpty(destination))
            {
                throw new ArgumentNullException(nameof(destination));
            }

            STEM_Copy(source, destination, ifExists, out destinationFilename, retryCount, retryDelaySeconds, true);
        }
示例#5
0
        public static void STEM_Copy(string source, string destination, FileExistsAction ifExists)
        {
            if (String.IsNullOrEmpty(source))
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (String.IsNullOrEmpty(destination))
            {
                throw new ArgumentNullException(nameof(destination));
            }

            string s = "";

            STEM_Copy(source, destination, ifExists, out s);
        }
示例#6
0
        public byte[] Upload(string localPath, string remoteDirectory, string remoteFileName, FileExistsAction fileExistsAction, FTPTransferProgressEventHandler progressChanged, CancellationTokenSource cts)
        {
            string path = (remoteDirectory + (string.IsNullOrWhiteSpace(remoteFileName) ? "" : "/" + remoteFileName));
            string url  = UnixPathUtils.Combine(_uri.ToString(), path);
            Uri    uri  = new Uri(url);

            if (fileExistsAction == FileExistsAction.Overwrite)
            {
                try
                {
                    Delete(Path.Combine(remoteDirectory, remoteFileName));
                }
                catch { }
            }
            else if (fileExistsAction == FileExistsAction.Skip && FileExists(path))
            {
                return(null);
            }
            using (WebClient client = new WebClient())
            {
                client.Credentials            = _credentials;
                client.UploadProgressChanged += (sender, e) =>
                {
                    double percent = (double)e.BytesSent / (double)e.TotalBytesToSend;
                    double seconds = _stopWatch.ElapsedMilliseconds / 1000;
                    double bps     = 0;
                    if (seconds > 0)
                    {
                        bps = e.BytesSent / seconds;
                    }
                    progressChanged?.Invoke(bps, percent * 100);
                };
                cts?.Token.Register(client.CancelAsync);

                try
                {
                    GetResponse(WebRequestMethods.Ftp.MakeDirectory, remoteDirectory);
                }
                catch { }

                _stopWatch = Stopwatch.StartNew();
                byte[] task = client.UploadFileTaskAsync(uri, "STOR", localPath.ToString()).GetAwaiter().GetResult();
                _stopWatch.Stop();
                return(task);
            }
        }
        /// <summary>
        /// 发出一次新的请求,把回应的主体内容保存到文件
        /// 调用此方法会触发StatusUpdate事件
        /// </summary>
        /// <param name="fileName">要保存的文件路径</param>
        /// <param name="existsAction">指定的文件存在时的选项</param>
        /// <returns>是否向目标文件写入了数据</returns>
        public bool SaveAsFile(string fileName, FileExistsAction existsAction)
        {
            byte[] data = this.GetBytes();
            switch (existsAction)
            {
                case FileExistsAction.Overwrite:
                    {
                        using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)))
                        {
                           writer.Write(data);
                        }

                        return true;
                    }

                case FileExistsAction.Append:
                    {
                        using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Append, FileAccess.Write)))
                        {
                            writer.Write(data);
                        }

                        return true;
                    }

                default:
                    {
                        if (!File.Exists(fileName))
                        {
                            using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write)))
                            {
                                writer.Write(data);
                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
            }
        }
示例#8
0
 public AdvCopyFileOptions()
 {
     DefaultFileExistsAction = FileExistsAction.Resume;
 }
示例#9
0
 public static void STEM_Copy(string source, string destination, FileExistsAction ifExists, out string destinationFilename, int retryCount, int retryDelaySeconds, bool useTempHop)
 {
     _Act(source, destination, ifExists, out destinationFilename, retryCount, retryDelaySeconds, useTempHop, false);
 }
示例#10
0
        static void _Act(string source, string destination, FileExistsAction ifExists, out string destinationFilename, int retryCount, int retryDelaySeconds, bool useTempHop, bool isMove)
        {
            if (String.IsNullOrEmpty(source))
            {
                throw new ArgumentNullException(nameof(source));
            }

            if (String.IsNullOrEmpty(destination))
            {
                throw new ArgumentNullException(nameof(destination));
            }

            source      = STEM.Sys.IO.Path.ChangeIpToMachineName(STEM.Sys.IO.Path.AdjustPath(source));
            destination = STEM.Sys.IO.Path.ChangeIpToMachineName(STEM.Sys.IO.Path.AdjustPath(destination));

            if (source.Equals(destination, StringComparison.InvariantCultureIgnoreCase))
            {
                destinationFilename = destination;
                return;
            }

            destinationFilename = "";

            if (isMove)
            {
                string sourceAddress      = STEM.Sys.IO.Net.MachineAddress(STEM.Sys.IO.Path.FirstTokenOfPath(source));
                string destinationAddress = STEM.Sys.IO.Net.MachineAddress(STEM.Sys.IO.Path.FirstTokenOfPath(destination));

                if (sourceAddress == destinationAddress)
                {
                    string sp = STEM.Sys.IO.Path.AdjustPath(source).TrimStart('\\').TrimStart('/');

                    if (sp.IndexOf(System.IO.Path.DirectorySeparatorChar) != -1)
                    {
                        sp = sp.Substring(sp.IndexOf(System.IO.Path.DirectorySeparatorChar));
                    }

                    sp = STEM.Sys.IO.Path.FirstTokenOfPath(sp);

                    string dp = STEM.Sys.IO.Path.AdjustPath(destination).TrimStart('\\').TrimStart('/');

                    if (dp.IndexOf(System.IO.Path.DirectorySeparatorChar) != -1)
                    {
                        dp = dp.Substring(dp.IndexOf(System.IO.Path.DirectorySeparatorChar));
                    }

                    dp = STEM.Sys.IO.Path.FirstTokenOfPath(dp);

                    if (sp.Equals(dp, StringComparison.InvariantCultureIgnoreCase))
                    {
                        useTempHop = false;
                    }
                }
            }

            while (retryCount >= 0)
            {
                if (!System.IO.File.Exists(source))
                {
                    throw new System.IO.FileNotFoundException("Could not find file " + source);
                }

                string d = destination;

                if (useTempHop)
                {
                    string dTemp = System.IO.Path.Combine(STEM.Sys.IO.Path.GetDirectoryName(d), "Temp");

                    if (!System.IO.Directory.Exists(dTemp))
                    {
                        System.IO.Directory.CreateDirectory(dTemp);
                    }

                    TempCleaner.Register(dTemp);
                }
                else
                {
                    if (!System.IO.Directory.Exists(STEM.Sys.IO.Path.GetDirectoryName(d)))
                    {
                        System.IO.Directory.CreateDirectory(STEM.Sys.IO.Path.GetDirectoryName(d));
                    }
                }

                try
                {
                    if (useTempHop)
                    {
                        string dTemp = System.IO.Path.Combine(STEM.Sys.IO.Path.GetDirectoryName(d), "Temp");

                        if (!System.IO.Directory.Exists(dTemp))
                        {
                            System.IO.Directory.CreateDirectory(dTemp);
                        }

                        dTemp = System.IO.Path.Combine(dTemp, Guid.NewGuid() + ".tmp");

                        try
                        {
                            if (System.IO.File.Exists(d))
                            {
                                switch (ifExists)
                                {
                                case FileExistsAction.Throw:
                                    throw new System.IO.IOException("Destination file already exists: " + destination);

                                case FileExistsAction.Skip:
                                    return;

                                case FileExistsAction.Overwrite:

                                    System.IO.File.Copy(source, dTemp, true);

                                    try
                                    {
                                        System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);
                                        System.IO.File.Copy(dTemp, d, true);
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new System.IO.IOException("Destination file could not be overwritten: " + d, ex);
                                    }

                                    break;

                                case FileExistsAction.OverwriteIfNewer:

                                    if (System.IO.File.GetLastWriteTimeUtc(d) >= System.IO.File.GetLastWriteTimeUtc(source))
                                    {
                                        return;
                                    }

                                    System.IO.File.Copy(source, dTemp, true);

                                    try
                                    {
                                        System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);
                                        System.IO.File.Copy(dTemp, d, true);
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new System.IO.IOException("Destination file could not be overwritten: " + d, ex);
                                    }

                                    break;

                                case FileExistsAction.MakeUnique:
                                    d = File.UniqueFilename(destination);

                                    System.IO.File.Copy(source, dTemp, true);
                                    System.IO.File.Move(dTemp, d);
                                    break;
                                }
                            }
                            else
                            {
                                System.IO.File.Copy(source, dTemp, true);
                                System.IO.File.Move(dTemp, d);
                            }

                            destinationFilename = d;

                            if (isMove)
                            {
                                while (retryCount >= 0)
                                {
                                    try
                                    {
                                        System.IO.File.Delete(source);
                                        break;
                                    }
                                    catch
                                    {
                                        if (retryCount <= 0)
                                        {
                                            throw;
                                        }
                                    }

                                    if (retryCount > 0)
                                    {
                                        System.Threading.Thread.Sleep(retryDelaySeconds * 1000);
                                    }

                                    retryCount--;
                                }
                            }
                        }
                        finally
                        {
                            int retry = 3;
                            while (retry-- > 0)
                            {
                                try
                                {
                                    if (System.IO.File.Exists(dTemp))
                                    {
                                        System.IO.File.Delete(dTemp);
                                    }

                                    break;
                                }
                                catch
                                {
                                    if (retry > 0)
                                    {
                                        System.Threading.Thread.Sleep(1000);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        if (System.IO.File.Exists(d))
                        {
                            switch (ifExists)
                            {
                            case FileExistsAction.Throw:
                                throw new System.IO.IOException("Destination file already exists: " + destination);

                            case FileExistsAction.Skip:
                                return;

                            case FileExistsAction.Overwrite:

                                System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);

                                System.IO.File.Copy(source, d, true);

                                if (isMove)
                                {
                                    while (retryCount >= 0)
                                    {
                                        try
                                        {
                                            System.IO.File.Delete(source);
                                            break;
                                        }
                                        catch
                                        {
                                            if (retryCount <= 0)
                                            {
                                                throw;
                                            }
                                        }

                                        if (retryCount > 0)
                                        {
                                            System.Threading.Thread.Sleep(retryDelaySeconds * 1000);
                                        }

                                        retryCount--;
                                    }
                                }

                                break;



                            case FileExistsAction.OverwriteIfNewer:

                                if (System.IO.File.GetLastWriteTimeUtc(d) >= System.IO.File.GetLastWriteTimeUtc(source))
                                {
                                    return;
                                }

                                System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);

                                System.IO.File.Copy(source, d, true);

                                if (isMove)
                                {
                                    while (retryCount >= 0)
                                    {
                                        try
                                        {
                                            System.IO.File.Delete(source);
                                            break;
                                        }
                                        catch
                                        {
                                            if (retryCount <= 0)
                                            {
                                                throw;
                                            }
                                        }

                                        if (retryCount > 0)
                                        {
                                            System.Threading.Thread.Sleep(retryDelaySeconds * 1000);
                                        }

                                        retryCount--;
                                    }
                                }

                                break;

                            case FileExistsAction.MakeUnique:

                                d = File.UniqueFilename(destination);

                                if (isMove)
                                {
                                    System.IO.File.Move(source, d);
                                }
                                else
                                {
                                    System.IO.File.Copy(source, d);
                                }

                                break;
                            }
                        }
                        else
                        {
                            if (isMove)
                            {
                                System.IO.File.Move(source, d);
                            }
                            else
                            {
                                System.IO.File.Copy(source, d);
                            }
                        }

                        destinationFilename = d;
                    }

                    if (destinationFilename == d)
                    {
                        break;
                    }
                }
                catch
                {
                    if (retryCount <= 0)
                    {
                        throw;
                    }
                }

                if (retryCount > 0)
                {
                    System.Threading.Thread.Sleep(retryDelaySeconds * 1000);
                }

                retryCount--;
            }

            if (String.IsNullOrEmpty(destinationFilename))
            {
                if (isMove)
                {
                    throw new Exception("File move failed: " + source);
                }
                else
                {
                    throw new Exception("File copy failed: " + source);
                }
            }
        }
示例#11
0
        public static void STEM_Move(string sourceDirName, string destDirName, string fileSearchPattern, string directorySearchPattern, FileExistsAction ifExists, bool expandSource, bool moveFilesOnly)
        {
            if (String.IsNullOrEmpty(sourceDirName))
            {
                throw new ArgumentNullException(nameof(sourceDirName));
            }

            if (String.IsNullOrEmpty(destDirName))
            {
                throw new ArgumentNullException(nameof(destDirName));
            }

            if (String.IsNullOrEmpty(fileSearchPattern))
            {
                throw new ArgumentNullException(nameof(fileSearchPattern));
            }

            if (String.IsNullOrEmpty(directorySearchPattern))
            {
                throw new ArgumentNullException(nameof(directorySearchPattern));
            }

            sourceDirName = STEM.Sys.IO.Path.AdjustPath(sourceDirName);
            destDirName   = STEM.Sys.IO.Path.AdjustPath(destDirName);

            List <string> files = STEM_GetFiles(sourceDirName, fileSearchPattern, directorySearchPattern, System.IO.SearchOption.AllDirectories, expandSource);

            foreach (string f in files)
            {
                File.STEM_Copy(f, System.IO.Path.Combine(destDirName, f.Substring(sourceDirName.TrimEnd('\\', '/').Length + 1)), ifExists);

                try
                {
                    System.IO.File.Delete(f);
                }
                catch { }
            }

            if (!moveFilesOnly)
            {
                STEM_Delete(sourceDirName, expandSource);
            }
        }
示例#12
0
        public static void STEM_Copy(string sourceDirName, string destDirName, string fileSearchPattern, string directorySearchPattern, FileExistsAction ifExists, bool expandSource)
        {
            if (String.IsNullOrEmpty(sourceDirName))
            {
                throw new ArgumentNullException(nameof(sourceDirName));
            }

            if (String.IsNullOrEmpty(destDirName))
            {
                throw new ArgumentNullException(nameof(destDirName));
            }

            if (String.IsNullOrEmpty(fileSearchPattern))
            {
                throw new ArgumentNullException(nameof(fileSearchPattern));
            }

            if (String.IsNullOrEmpty(directorySearchPattern))
            {
                throw new ArgumentNullException(nameof(directorySearchPattern));
            }

            List <string> files = STEM_GetFiles(sourceDirName, fileSearchPattern, directorySearchPattern, System.IO.SearchOption.AllDirectories, expandSource);

            foreach (string f in files)
            {
                File.STEM_Copy(f, System.IO.Path.Combine(destDirName, f.Substring(sourceDirName.TrimEnd('\\', '/').Length + 1)), ifExists);
            }
        }
 private void ButtonCancelClick(object sender, EventArgs e)
 {
     DialogResult = DialogResult.Cancel;
     FileExistsAction = FileExistsAction.Cancel;
     Close();
 }
 private void ButtonReplaceClick(object sender, EventArgs e)
 {
     DialogResult = DialogResult.OK;
     FileExistsAction = FileExistsAction.Replace;
     Close();
 }
示例#15
0
 public void Upload(string localPath, string remoteDirectory, string remoteFileName, FileExistsAction fileExistsAction, FTPTransferProgressEventHandler progressChanged, FTPTransferCanceledEventHandler uploadCanceled, CancellationTokenSource cts)
 {
     try
     {
         Upload(localPath, remoteDirectory, remoteFileName, fileExistsAction, progressChanged, cts);
     }
     catch (WebException e)
     {
         uploadCanceled?.Invoke(e);
     }
 }
示例#16
0
 public void Upload(string localPath, string remoteDirectory, string remoteFileName, FileExistsAction fileExistsAction)
 {
     Upload(localPath, remoteDirectory, remoteFileName, fileExistsAction, null, null, null);
 }
 private void ButtonSkipClick(object sender, EventArgs e)
 {
     DialogResult = DialogResult.None;
     FileExistsAction = FileExistsAction.Skip;
     Close();
 }
示例#18
0
 public AdvCopyFileOptions()
 {
     DefaultFileExistsAction = FileExistsAction.Resume;
 }
示例#19
0
        public void UploadMultiple(List <Tuple <string, string, string> > filesWithPaths, FileExistsAction fileExistsAction, FTPMultipleTransferProgressChangedEventHandler uploadProgressChanged, FTPTransferProgressEventHandler progressChanged, FTPTransferCanceledEventHandler uploadCanceled, CancellationTokenSource cts)
        {
            try
            {
                for (int i = 1; i <= filesWithPaths.Count; i++)
                {
                    var item = filesWithPaths[i - 1];

                    Upload(item.Item1, item.Item2, item.Item3, fileExistsAction, progressChanged, cts);
                    uploadProgressChanged.Invoke(i);
                }
            }
            catch (WebException exception)
            {
                uploadCanceled.Invoke(exception);
            }
        }
示例#20
0
        /// <summary>
                /// 发出一次新的请求,把回应的主体内容保存到文件
                /// 调用此方法会触发StatusUpdate事件
                /// </summary>
                /// <param name="fileName">要保存的文件路径</param>
                /// <param name="existsAction">指定的文件存在时的选项</param>
                /// <returns>是否向目标文件写入了数据</returns>
        public async Task<bool> SaveAsFile(string fileName, FileExistsAction existsAction)
        {
            byte[] data = await GetBytes();
            switch (existsAction)
            {
                case FileExistsAction.Overwrite:
                    using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write)))
                        writer.Write(data);
                    return true;

                case FileExistsAction.Append:
                    using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Append, FileAccess.Write)))
                        writer.Write(data);
                    return true;

                default:
                    if (!File.Exists(fileName))
                    {
                        using (
                        BinaryWriter writer =
                        new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write)))
                            writer.Write(data);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
            }
        }
示例#21
0
        public static void STEM_Move(string sourceDirName, string destDirName, string fileSearchPattern, string directorySearchPattern, FileExistsAction ifExists, bool expandSource)
        {
            if (String.IsNullOrEmpty(sourceDirName))
            {
                throw new ArgumentNullException(nameof(sourceDirName));
            }

            if (String.IsNullOrEmpty(destDirName))
            {
                throw new ArgumentNullException(nameof(destDirName));
            }

            if (String.IsNullOrEmpty(fileSearchPattern))
            {
                throw new ArgumentNullException(nameof(fileSearchPattern));
            }

            if (String.IsNullOrEmpty(directorySearchPattern))
            {
                throw new ArgumentNullException(nameof(directorySearchPattern));
            }

            STEM_Move(sourceDirName, destDirName, fileSearchPattern, directorySearchPattern, ifExists, false, expandSource);
        }