Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }