📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

279行目: 279行目:
       // 複数のファイルを同時に受信
       // 複数のファイルを同時に受信
       await ftpDownload.DownloadMultipleFilesAsync(filesToDownload);
       await ftpDownload.DownloadMultipleFilesAsync(filesToDownload);
    }
}
</syntaxhighlight>
<br><br>
== FTPS : データの送信 ==
以下の例では、FTPS (SSL / TLS証明書) を使用して、ASCIIモード (テキストファイル) とバイナリモード (画像ファイル等) で複数のファイルを非同期に送信している。<br>
<br>
※注意<br>
実務では、適切なSSL / TLS証明書の検証を行うこと。<br>
ファイアウォールやネットワーク設定が、FTPSトラフィック (通常は、990番ポート) を許可していることを確認する。<br>
<br>
また、大量のファイルや大きなファイルを送信する場合は、タイムアウト設定やメモリ使用量に注意する。<br>
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
class AsyncFtpsFileUpload
{
    private string host;
    private string username;
    private string password;
    private int port;
    // FTPS接続に必要な情報
    public AsyncFtpsFileUpload(string host, string username, string password, int port = 990)
    {
      this.host    = host;
      this.username = username;
      this.password = password;
      this.port    = port;
    }
    // 単一のファイルを非同期でアップロード
    public async Task UploadFileAsync(string localFilePath, string remoteFilePath, bool useAscii)
    {
      try
      {
          // FTPS要求の作成
          FtpWebRequest request = (FtpWebRequest)WebRequest.Create($"ftps://{host}:{port}/{remoteFilePath}");
          request.Method = WebRequestMethods.Ftp.UploadFile;  // ファイルの送信
          request.Credentials = new NetworkCredential(username, password);
          request.UsePassive = true;      // パッシブモードを使用するかどうかの可否
          request.UseBinary = !useAscii;  // ASCIIモードとバイナリモードの切り替え
          request.KeepAlive = false;
          request.EnableSsl = true;  // SSLを有効化
          // SSL / TLS証明書の検証
          // 注意: 実務では適切に証明書を検証すること
          ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
          using (FileStream fileStream = File.OpenRead(localFilePath))
          using (Stream ftpStream = await request.GetRequestStreamAsync())
          {
            // ファイルは10[KB]のバッファを使用して読み取り、FTPストリームに書き込む
            byte[] buffer = new byte[10240];
            int read;
            while ((read = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                await ftpStream.WriteAsync(buffer, 0, read);
            }
          }
          using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync())
          {
            Console.WriteLine($"ファイルの送信が完了: {localFilePath} -> {remoteFilePath}");
            Console.WriteLine($"ステータス: {response.StatusDescription}");
          }
      }
      catch (WebException ex)
      {
          FtpWebResponse response = (FtpWebResponse)ex.Response;
          if (response != null)
          {
            Console.WriteLine($"FTPS送信エラー: {response.StatusDescription}");
          }
          else
          {
            Console.WriteLine($"Web例外が発生: {ex.Message}");
          }
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
    // 複数のファイルを同時に非同期でアップロードするメソッド
    public async Task UploadMultipleFilesAsync(List<(string localFilePath, string remoteFilePath, bool useAscii)> files)
    {
      List<Task> uploadTasks = new List<Task>();
      // 各ファイルのアップロードタスクを生成して、リストに追加
      foreach (var file in files)
      {
          uploadTasks.Add(UploadFileAsync(file.localFilePath, file.remoteFilePath, file.useAscii));
      }
      // 全てのアップロードタスクが完了するまで待機
      await Task.WhenAll(uploadTasks);
      Console.WriteLine("全てのファイルの送信が完了");
    }
    public static async Task Main()
    {
      // FTPS接続情報
      string host    = "<ホスト名またはIPアドレス  例: ftps.example.com>";
      string username = "<ユーザ名>";
      string password = "<パスワード>";
      int port        = 990;  // FTPSの標準ポート
      AsyncFtpsFileUpload ftpsUpload = new AsyncFtpsFileUpload(host, username, password, port);
      // 送信するファイル群
      List<(string localFilePath, string remoteFilePath, bool useAscii)> filesToUpload = new List<(string, string, bool)>
      {
          ("localTextFile1.txt", "remoteTextFile1.txt", true),  // テキストファイル(ASCIIモード)
          ("localTextFile2.txt", "remoteTextFile2.txt", true),  // テキストファイル(ASCIIモード)
          ("localImageFile1.jpg", "remoteImageFile1.jpg", false),  // 画像ファイル(バイナリモード)
          ("localImageFile2.jpg", "remoteImageFile2.jpg", false)  // 画像ファイル(バイナリモード)
      };
      // 複数のファイルを同時に送信
      await ftpsUpload.UploadMultipleFilesAsync(filesToUpload);
     }
     }
  }
  }