ディレクトリサイズを取得するための標準のFTPコマンドはありません。
すべてのサブディレクトリとファイルを再帰的に繰り返し、サイズを合計する必要があります。
これは、FTPプロトコルでファイル属性を使用してディレクトリリストを取得する唯一の移植可能な方法であるコマンドをFtpWebRequest
サポートしていないため、.NETFramework/では簡単ではありません。MLSD
LIST
コマンド( )を使用しListDirectoryDetails
て、サーバー固有のリストを解析するだけです。多くのFTPサーバーは*nixスタイルのリストを使用します。しかし、多くのサーバーは異なるフォーマットを使用しています。次の例では、*nix形式を使用しています。
static long CalculateFtpDirectorySize(string url, NetworkCredential credentials)
{
FtpWebRequest listRequest = (FtpWebRequest)WebRequest.Create(url);
listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
listRequest.Credentials = credentials;
List<string> lines = new List<string>();
using (var listResponse = (FtpWebResponse)listRequest.GetResponse())
using (Stream listStream = listResponse.GetResponseStream())
using (StreamReader listReader = new StreamReader(listStream))
{
while (!listReader.EndOfStream)
{
lines.Add(listReader.ReadLine());
}
}
long result = 0;
foreach (string line in lines)
{
string[] tokens =
line.Split(new[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries);
string name = tokens[8];
string permissions = tokens[0];
string fileUrl = url + name;
if (permissions[0] == 'd')
{
result += CalculateFtpDirectorySize(fileUrl + "/", credentials);
}
else
{
result += long.Parse(tokens[4]);
}
}
return result;
}
次のように使用します。
var credentials = new NetworkCredential("username", "password");
long size = CalculateFtpDirectorySize("ftp://ftp.example.com/", credentials);
サーバーがDOS/Windowsリスト形式を使用している場合は、 C#クラスを参照してWebRequestMethods.Ftp.ListDirectoryDetailsFTP応答を解析してください
MLSD
または、最新のコマンドをサポートするサードパーティのFTPクライアント実装を使用することもできます。
たとえば、WinSCP.NETアセンブリはそれをサポートしています。
また、ディレクトリサイズの計算を簡単にする便利なSession.EnumerateRemoteFiles
方法もあります。
var opts = EnumerationOptions.AllDirectories;
var files = session.EnumerateRemoteFiles("/", null, opts);
long size = files.Select(fileInfo => fileInfo.Length).Sum();
完全なコードは次のようになります。
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Ftp,
HostName = "ftp.example.com",
UserName = "username",
Password = "password",
};
using (Session session = new Session())
{
// Connect
session.Open(sessionOptions);
var opts = EnumerationOptions.AllDirectories;
var files = session.EnumerateRemoteFiles("/", null, opts);
long size = files.Select(fileInfo => fileInfo.Length).Sum();
}
(私はWinSCPの作者です)