12,964
回編集
(ページの作成:「== 概要 == 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); | |||
} | } | ||
} | } |