「C Sharpとネットワーク - FTP」の版間の差分

ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == FTP (File Transfer Protocol) は、インターネットを介してファイルを転送するために使用される標準的なネットワークプロトコルである。<br> 1971年に開発され、現在でも広く使用されている。<br> <br> FTPの主な目的は、クライアントとサーバ間でのファイルの送受信を可能にすることである。<br> これは、Webサイトの更新、大容量ファイルの共有、…」)
 
161行目: 161行目:
       // バイナルモード送信 (画像ファイル等のバイナリファイル向け)
       // バイナルモード送信 (画像ファイル等のバイナリファイル向け)
       await ftpTransfer.UploadFileAsync("localImageFile.jpg", "remoteImageFile.jpg", false);
       await ftpTransfer.UploadFileAsync("localImageFile.jpg", "remoteImageFile.jpg", false);
    }
}
</syntaxhighlight>
<br><br>
== FTP : データの受信 ==
以下の例では、FTPを使用して、ASCIIモード (テキストファイル) とバイナリモード (画像ファイル等) で複数のファイルを同時に受信している。<br>
<br>
<u>※注意</u><br>
<u>サーバによっては、同時接続数に制限がある場合があるため、FTPサーバの同時接続数制限に注意すること。</u><br>
<br>
<u>また、大量のファイルをダウンロードする場合は、メモリ使用量に注意すること。</u><br>
<u>必要に応じて、ダウンロードをバッチ処理することを検討する。</u><br>
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Net;
using System.Collections.Generic;
using System.Threading.Tasks;
class AsyncFtpFileDownload
{
    private string host;
    private string username;
    private string password;
    // FTP接続に必要な情報
    public AsyncFtpFileDownload(string host, string username, string password)
    {
      this.host = host;
      this.username = username;
      this.password = password;
    }
    // 単一のファイルを非同期でダウンロード
    public async Task DownloadFileAsync(string remoteFilePath, string localFilePath, bool useAscii)
    {
      try
      {
          // FTP要求の作成
          FtpWebRequest request = (FtpWebRequest)WebRequest.Create($"ftp://{host}/{remoteFilePath}");
          request.Method = WebRequestMethods.Ftp.DownloadFile;  // ファイルの受信
          request.Credentials = new NetworkCredential(username, password);
          request.UsePassive  = true;      // パッシブモードを使用するかどうかの可否
          request.UseBinary  = !useAscii;  // ASCIIモードとバイナリモードの切り替え
          request.KeepAlive  = false;
          using (FtpWebResponse response = (FtpWebResponse)await request.GetResponseAsync())
          using (Stream ftpStream = response.GetResponseStream())
          using (FileStream fileStream = File.Create(localFilePath))
          {
            // ファイルは10[KB]のバッファを使用して読み取り、FTPストリームに書き込む
            byte[] buffer = new byte[10240];
            int read;
            while ((read = await ftpStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
            {
                await fileStream.WriteAsync(buffer, 0, read);
            }
            Console.WriteLine($"ファイルの受信が完了: {remoteFilePath} -> {localFilePath}");
            Console.WriteLine($"ステータス: {response.StatusDescription}");
          }
      }
      catch (WebException ex)
      {
          FtpWebResponse response = (FtpWebResponse)ex.Response;
          if (response != null)
          {
            Console.WriteLine($"FTP受信エラー: {response.StatusDescription}");
          }
          else
          {
            Console.WriteLine($"Web例外が発生: {ex.Message}");
          }
      }
      catch (Exception ex)
      {
          Console.WriteLine($"予期せぬエラーが発生: {ex.Message}");
      }
    }
    // 複数のファイルを同時に非同期でダウンロードするメソッド
    public async Task DownloadMultipleFilesAsync(List<(string remoteFilePath, string localFilePath, bool useAscii)> files)
    {
      List<Task> downloadTasks = new List<Task>();
      // 各ファイルのダウンロードタスクを生成して、リストに追加
      foreach (var file in files)
      {
          downloadTasks.Add(DownloadFileAsync(file.remoteFilePath, file.localFilePath, file.useAscii));
      }
      // 全てのダウンロードタスクが完了するまで待機
      await Task.WhenAll(downloadTasks);
      Console.WriteLine("全てのファイルの受信が完了");
    }
    public static async Task Main()
    {
      // FTP接続情報
      string host    = "<ホスト名またはIPアドレス  例: ftp.example.com>";
      string username = "<ユーザ名>";
      string password = "<パスワード>";
      AsyncFtpFileDownload ftpDownload = new AsyncFtpFileDownload(host, username, password);
      // 受信するファイル群
      List<(string remoteFilePath, string localFilePath, bool useAscii)> filesToDownload = new List<(string, string, bool)>
      {
          ("remoteTextFile1.txt", "localTextFile1.txt", true),  // テキストファイル(ASCIIモード)
          ("remoteTextFile2.txt", "localTextFile2.txt", true),  // テキストファイル(ASCIIモード)
          ("remoteImageFile1.jpg", "localImageFile1.jpg", false),  // 画像ファイル(バイナリモード)
          ("remoteImageFile2.jpg", "localImageFile2.jpg", false)  // 画像ファイル(バイナリモード)
      };
      // 複数のファイルを同時に受信
      await ftpDownload.DownloadMultipleFilesAsync(filesToDownload);
     }
     }
  }
  }

案内メニュー