SFTP接続 [C#]

準備

NuGetでSSH.NETをインストール

サンプル

using Renci.SshNet;
using System;
using System.Collections.Generic;
using System.IO;

namespace Sample
{
    public class Sftp : IDisposable
    {
        /// <summary>
        /// Sftpクライアント
        /// </summary>
        private SftpClient Client { get; set; }

        /// <summary>
        /// コンストラクタ
        /// クライアントを生成して接続
        /// </summary>
        /// <param name="host">接続先</param>
        /// <param name="username">ユーザー名</param>
        /// <param name="password">パスワード</param>
        /// <param name="port">ポート番号</param>
        public Sftp(string host, string username, string password, int port = 22)
        {
            // 初期化
            Client = null;
            // クライアント生成
            Client = new SftpClient(host, port, username, password);
            // 接続
            Client.Connect();
        }

        /// <summary>
        /// デストラクタ
        /// </summary>
        public void Dispose()
        {
            // クライアント破棄
            Client?.Dispose();
        }

        /// <summary>
        /// ディレクトリ変更
        /// </summary>
        /// <param name="dir">変更先ディレクトリ</param>
        public void ChangeDirectory(string dir)
        {
            // 指定ディレクトリに変更
            Client.ChangeDirectory(dir);
        }

        /// <summary>
        /// ファイル一覧取得
        /// </summary>
        /// <param name="dir">取得対象ディレクトリ</param>
        /// <returns>ファイル一覧</returns>
        public List<string> Files(string dir = "")
        {
            // ワーク
            var files = new List<string>();
            // 一覧取得
            foreach (var file in Client.ListDirectory(dir))
                if (file.IsRegularFile)
                    files.Add(file.Name);
            // ファイル一覧を返す
            return files;
        }

        /// <summary>
        /// ファイル存在確認
        /// </summary>
        /// <param name="path">ファイルパス</param>
        /// <returns></returns>
        public bool Exists(string path)
        {
            return Client.Exists(path);
        }

        /// <summary>
        /// アップロード処理
        /// </summary>
        /// <param name="src">元ファイルパス</param>
        /// <param name="dst">先ファイルパス</param>
        /// <returns></returns>
        public bool Upload(string src, string dst)
        {
            // アップロードするファイルがない場合
            if (!File.Exists(src))
                return false;
            // 同名ファイルが既にアップロード先にある場合
            if (Client.Exists(dst))
                return false;
            // アップロード処理
            using (var fs = new FileStream(src, FileMode.Open))
                Client.UploadFile(fs, dst);
            // 正常終了
            return true;
        }

        /// <summary>
        /// ダウンロード処理
        /// </summary>
        /// <param name="src">元ファイルパス</param>
        /// <param name="dst">先ファイルパス</param>
        /// <returns>true : 正常, false : 異常</returns>
        public bool Download(string src, string dst)
        {
            // ダウンロードするファイルが存在しない場合
            if (!Client.Exists(src))
                return false;
            // 同名のファイルがすでに存在する場合
            if (File.Exists(dst))
                return false;
            // ダウンロード処理
            using (var fs = File.Create(dst))
                Client.DownloadFile(src, fs);
            // 正常終了
            return true;
        }
    }
}
タイトルとURLをコピーしました