/// <summary> /// FTP 원격 파일을 지정한 로칼 파일로 저장한다. /// </summary> /// <param name="remoteFilename">원격 파일 전체 경로 (예: /Users/debop/readme.txt)</param> /// <param name="localFI">로칼 파일 정보</param> /// <param name="canOverwrite">겹쳐쓰기 여부</param> /// <returns>다운로드 여부</returns> public virtual bool Download(string remoteFilename, FileInfo localFI, bool canOverwrite = false) { localFI.ShouldNotBeNull("localFI"); if(IsDebugEnabled) log.Debug("원격 파일을 다운로드 합니다... remoteFilename=[{0}], localFilename=[{1}], canOverwrite=[{2}]", remoteFilename, localFI.FullName, canOverwrite); if(localFI.Exists && !canOverwrite) throw new FtpException("로컬 파일이 이미 존재합니다. localFile=" + localFI.FullName); bool isDownload; using(var localStream = new BufferedStream(localFI.OpenWrite())) { isDownload = Download(remoteFilename, localStream); if(isDownload) localStream.Flush(); } if(isDownload == false) With.TryAction(() => localFI.Delete()); if(IsDebugEnabled) log.Debug("원격 파일[{0}]을 다운로드 작업을 마쳤습니다. 로컬 파일=[{1}], 성공여부=[{2}]", remoteFilename, localFI.FullName, isDownload); return isDownload; }
/// <summary> /// <paramref name="ftpClient"/>를 이용하여, 로컬 파일 스트림을 FTP 서버로 Upload 합니다. /// </summary> /// <param name="ftpClient"></param> /// <param name="localFi"></param> /// <param name="remoteFilename">원격 파일 경로</param> /// <returns></returns> public static Task<bool> UploadTask(this FtpClient ftpClient, FileInfo localFi, string remoteFilename = null) { localFi.ShouldNotBeNull("localFi"); if(IsDebugEnabled) log.Debug("FTP 서버로 파일[{0}]을 비동기 방식으로 업로드합니다... 원격파일=[{1}]", localFi.FullName, remoteFilename); var stream = localFi.OpenRead(); return UploadTask(ftpClient, stream, remoteFilename ?? localFi.Name) .ContinueWith(t => { stream.Close(); return t.Result; }, TaskContinuationOptions.ExecuteSynchronously); }
/// <summary> /// 지정된 로칼 파일을 FTP 서버에 지정된 파일명으로 저장한다. /// </summary> /// <param name="fi"></param> /// <param name="remoteFilename"></param> /// <returns></returns> public virtual bool Upload(FileInfo fi, string remoteFilename) { fi.ShouldNotBeNull("fi"); if(IsDebugEnabled) log.Debug("Upload local file to ftp server. local file=[{0}], remoteFilename=[{1}]", fi.FullName, remoteFilename); if(remoteFilename.IsWhiteSpace()) // 원격파일명을 지정하지 않은 경우는 remoteFilename = CurrentDirectory + fi.Name; using(var bs = new BufferedStream(fi.OpenRead())) return Upload(bs, remoteFilename); }
/// <summary> /// FTP 서버의 원격 파일을 로컬로 비동기 방식으로 다운로드 받습니다. /// </summary> public static Task<bool> DownloadTask(this FtpClient ftpClient, string remoteFilename, FileInfo localFi) { localFi.ShouldNotBeNull("localFi"); if(IsDebugEnabled) log.Debug("원격 파일을 다운로드 받는 작업을 생성합니다... remoteFilename=[{0}], localFi=[{1}]", remoteFilename, localFi.FullName); var stream = localFi.OpenWrite(); return DownloadTask(ftpClient, remoteFilename, stream) .ContinueWith(t => { stream.Close(); return t.Result; }, TaskContinuationOptions.ExecuteSynchronously); }