ディレクトリサイズを取得するための標準FTPコマンドはありません。
すべてのサブディレクトリとファイルを再帰的に反復してサイズを合計する必要があります。
.NET Framework/FtpWebRequest
では、FTPプロトコルのファイル属性を持つディレクトリリストを取得する唯一の移植可能な方法であるMLSD
コマンドをサポートしていないため、これは簡単ではありません。
コマンド(ListDirectoryDetails
)を使用して、サーバー固有のリストを解析することができます。多くのFTPサーバーは* 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 (FtpWebResponse 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;
}
それが好きで使用してください:あなたはまたC# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
を参照してください、
var credentials = new NetworkCredential("username", "password");
long size = CalculateFtpDirectorySize("ftp://ftp.example.com/", credentials);
をお使いのサーバがリスト形式をDOS/Windowsを使用している場合は、次の例では、* nixの形式を使用しています最新のMLSD
コマンドをサポートするサードパーティのFTPクライアントの実装を使用できます。
たとえば、WinSCP .NET assemblyがこれをサポートします。
そしてそれも、ディレクトリのサイズ簡単な作業では計算になり便利Session.EnumerateRemoteFiles
方法、あります(私はWinSCPのの作者だ
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 files = session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);
long size = files.Select(fileInfo => fileInfo.Length).Sum();
}
:完全なコードは次のようになります
var files = session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);
long size = files.Select(fileInfo => fileInfo.Length).Sum();
を)
なぜFTPを選択しましたか?他のプロトコルにもオープンですか? – CodesInChaos
他のプロトコルに応じて、私はそれを撃つことができます。私はスピードのためにFTPを行っただけです。 – Seb