2024年4月2日火曜日

C#.NET FTP操作パッケージ – FluentFTP

 何が起こったか

最近、私のプロジェクトで、クライアントの要件としてファイルをローカルマシンやデータベースではなくFTPサーバーに保存する必要性が発生しました。そのため、C#でFTPを簡単に操作する方法を調査し始めました。


以前、私のFTPに関する理解は手動でFileZillaを使用することに限られており、プログラムでの操作についてはまだ探求していませんでした。


FluentFTPの紹介

GitHubの作者によると、FluentFTPは.NETをベースにしたFTPとFTPS向けのツールで、ファイルのアップロード/ダウンロード、SSL/TLS接続、自動ディレクトリリストの解析、ファイルのハッシュ/検証、ファイルのパーミッション/CHMOD、FTPプロキシ、FXP転送、UTF-8サポート、Async/awaitサポート、PowerShellサポートなど、いくつかの一般的な操作をサポートしています。

さらに、外部依存関係を排除して完全にC#で書かれています。プロジェクトで使用するには、NuGetを介して簡単にダウンロードできます - NuGet Gallery | FluentFTP 48.0.3


一般的な機能

ここでは、プロジェクトで使用したいくつかの機能を紹介します(後で追加の紹介が提供される場合があります)。

機能のいずれかを使用する前に、接続を確立してください(C#のusingディレクティブにFluentFTPを含めることを忘れないでください)。


接続の確立


private static FtpClient createFtpClient() {
	FtpClient ftp = new FtpClient(ftpAddress, ftpPort);
	ftp.Credentials = new System.Net.NetworkCredential(ftpAcc, ftpPwd);

	ftp.Connect();
	return ftp;
} 
ここに共有接続を確立する簡単な方法があります。プロジェクトでFTPに関するさまざまな操作があるため、接続方法は抽出して独立して書かれています。

接続の詳細には以下が含まれます:
  • ftpAddress:FTPサーバーのIPアドレス(エイリアスも機能するようです)。
  • ftpPort:FTPサーバーのポート番号。
  • ftpAcc、ftpPwd:FTP接続のユーザーアカウントとパスワード。
また、Connectメソッドがあるので、Disconnectもあります。通常、使用後に接続を終了するために呼び出されます。


フォルダの作成

public static bool initDict() {
	bool result = false;
	try
	{
		FtpClient ftp = createFtpClient();
		result = ftp.CreateDirectory("pdf");

		ftp.Disconnect();
	}
	catch (Exception ex) {
		throw ex;
	}

	return result;
} 
ftp.CreateDirectory:指定したディレクトリが存在しない場合、作成されます。

これは複数のレベルを作成するのにも役立ちます。たとえば、ftp.CreateDirectory("pdf\\test")は、ルートに「pdf」というフォルダを作成し、その下に「test」というサブフォルダを作成します。


ファイルのアップロード(単一ファイル)

public static bool uploadPdf(HttpPostedFileBase file) {
	bool result = false;
	FtpClient ftp = createFtpClient();
	
	byte[] fileBytes;
	using (BinaryReader reader = new BinaryReader(file.InputStream))
	{
		fileBytes = reader.ReadBytes(file.ContentLength);
	}

	FtpStatus ftpStatus = ftp.UploadBytes(fileBytes, "pdf\\" + file.FileName);

	ftp.Disconnect();
	return result;
}

このセクションでは、UploadBytesメソッドを使用してバイト配列をアップロードします。提供された例では、PDFファイルをFTPサーバーの「pdf」フォルダに送信します。

さらに、FtpStatusには3つの可能な値があります:失敗の場合は0、成功の場合は1、スキップされた場合は2です。 「スキップされた」ステータスは、ファイルがすでにFTPサーバーに存在する場合に発生します。


FTPディレクトリにディレクトリ全体をアップロード

public static void uploadDir(string uploadDir, string desDir) {
	FtpClient ftp = createFtpClient();

	ftp.CreateDirectory(desDir);
	List<FtpResult> res = ftp.UploadDirectory(uploadDir, desDir);
	ftp.Disconnect();
}
ftp.UploadDirectory:ローカルディレクトリ全体をFTPサーバーの指定したディレクトリにアップロードします。

このメソッドは、アップロードプロセスの各ファイルの状態を含むFtpResultオブジェクトのリストを返します。


単一ファイルのダウンロード

public static byte[] downloadPdf(string pdfName) {
	byte[] arr;
	FtpClient ftp = createFtpClient();

	bool res = ftp.DownloadBytes(out arr, "pdf\\" + pdfName);
	ftp.Disconnect();

	return arr;
}

outパラメータを使用してファイルをダウンロードし、byte[]を提供し、ファイルの場所を指定します。

この例では、以前にアップロードしたPDFをダウンロードします。


現在のディレクトリをリストします

/// <summary>
/// 現在のディレクトリの内容をリストします(再帰的ではなく)。
/// </summary>
public void ListAll()
{
    FtpClient ftp = CreateFtpClient();

    foreach (var item in ftp.GetListing())
    {
        Debug.WriteLine(item.ToString());
    }

    ftp.Disconnect();
}

結論

この記事では、FluentFTPパッケージの基本的な使用方法を主に文書化しています。

より高度な側面が探求されれば、更新が続く可能性があります。問題が発生した場合や質問がある場合は、コメントを残していただければ、対応いたします。

最近ではFTPを操作するためにプログラムを使用することはあまり一般的ではありませんが、個人的にはデータをデータベースに保存することを好みます。


💔 この記事全体は独自に書かれ、テストされました。引用や参照は自由ですが、全文をそのままコピーすることは避けてください。

🧡 ポストを共有してチームをサポートしていただければ幸いです。ありがとうございます。

✅ この記事に関する問題がありましたら、お気軽にお問い合わせください。




0 件のコメント:

コメントを投稿

JavaScript – 配列内の最大値を取得する3つの方法

何が起こったか 最近、問題を解決している際に、JavaScriptで配列の最大値を取得する必要がありました。具体的には、 LeetCode #300 Longest Increasing Subsequence の問題に取り組んでいました。 しかし、JavaScriptはC#の ...