Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

C#でのFTP ファイル転送

今回はC#でのFTPファイル転送についてまとめていきたいと思います!!
ちょっと興味があり、以前調べたのですが使うことがなく。。。
忘れない内に備忘録として残しておきたいと思います!!


FTPとは?

超基礎的ですが、一応。
FTPとは「File Transfer Protocol」の略称であり、ファイルを転送・通信するための規格です。
クライアントとサーバ間で、ファイルのアップロード・ダウンロードを行うときに使われるプロトコルのことです。

■構成

今回はubuntu16.04上にFTPサーバを立て、FTPクライエントとしてC#で作成したソフトを動作させたいと思います。
f:id:Elsammit:20201005222611p:plain

FTPサーバーへのファイルアップロード

FTPクライアントからのファイルアップロードを行う場合(ファイルダウンロードもですが)、
System.Netを利用するため、前もって、

using System.Net

を定義しておきます。

メインのファイルアップロードですが、コードはこちらになります。

try
{
    WebClient wc = new WebClient();
    wc.Credentials = new NetworkCredential("ユーザ名", "password");

    foreach (string FilePath in FileList)
    {
        string FileName = System.IO.Path.GetFileName(FilePath);                 // ファイル名取得.
        wc.UploadFile(string.Format("{0}/{1}", FTPpath, FileName), FilePath);   // ファイルアップロード.
    }
}
catch (Exception e)
{
    Ret = -1;
    Console.WriteLine(e.ToString());
}
    WebClient wc = new WebClient();
    wc.Credentials = new NetworkCredential("ユーザ名", "password");

にてFTPサーバとの接続を実施します。
※ユーザ名、passwordにはFTPサーバ側のユーザ名とパスワードを入力してください。

そして、送信するのはWebClientのUploadFileを用います。
UploadFileの引数は、

UploadFile("送信先パス","送信元ファイルパス")

となります。
今回は、string.Formatを用いて、ファイル名とファイルパスを分離して渡しております。

ここで、送信先パスが存在しない場合にはエラーになりますので注意下さい。

FTPサーバー側でフォルダが存在するかをチェックする処理はこちらになります。
アップロード前にパスが存在するか確認するのがよいですね。

WebRequest request = WebRequest.Create(FTPpath);
request.Credentials = new NetworkCredential("ユーザ名", "password");

request.Method = WebRequestMethods.Ftp.ListDirectory;   // リクエスト生成(存在するディレクトリチェック)

using (WebResponse res = request.GetResponse())     // ディレクトリ名取得.
{
    using (StreamReader sr = new StreamReader(res.GetResponseStream()))
    { Ret = sr.ReadToEnd(); }      // ディレクリ名の文字列を生成.
}
wc.Dispose();

こちらでFTPpathで指定したファイルパス以降に存在するフォルダリストが取得できます。

request.Method = WebRequestMethods.Ftp.ListDirectory;   // リクエスト生成(存在するディレクトリチェック)

FTPサーバーからのファイルダウンロード

次はサーバーからのファイルダウンロードです。
。。。といってもFTPサーバーへのアップロードとほとんど同じです。

try
{
    WebClient wc = new WebClient();
    wc.Credentials = new  NetworkCredential("ユーザ名", "password");

    foreach (string FilePath in FileList)
    {
        string FileName = System.IO.Path.GetFileName(FilePath);                 // ファイル名取得.
        wc.DownloadFile(string.Format("{0}/{1}", FTPpath, FileName), FilePath);   // ファイルダウンロード.
    }
    wc.Dispose();
}

アップロードと異なる点はこちらになります。

wc.DownloadFile(string.Format("{0}/{1}", FTPpath, FileName), FilePath);   // ファイルダウンロード.

DownloadFileというAPIを用いればFTPからのダウンロードが行えます。
DownloadFileは、

DownloadFile("ダウンロード対象パス", "ダウンロード先パス");

となります。

こちらについてもファイルが存在しない場合にはエラーになってしまいます。
ファイルの存在有無は先ほどのWebRequestMethods.Ftp.ListDirectoryで確認することが出来るので、こちらも前もって確認しておくとよいですね。

■最後に

C#でアプリのUI実装とかを作り始めております。
何か出来たら紹介出来ればな!と考えております。

作っていたUIアプリで使うかな?と思って勉強してみましたが、、、
使う機会がない。。。