디렉토리 크기를 검색하는 표준 FTP 명령은 없습니다.
모든 하위 디렉터리와 파일을 반복적으로 반복하고 크기를 합산해야합니다.
.NET Framework/FtpWebRequest
에서는 FTP 프로토콜의 파일 특성을 사용하여 디렉터리 목록을 검색 할 수있는 유일한 휴대용 방법 인 MLSD
명령을 지원하지 않으므로 쉽지 않습니다.
당신이 할 수있는 일은 명령 (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 (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;
}
이 좋아 사용 : 서버가 DOS/윈도우 목록 형식을 사용하는 경우
var credentials = new NetworkCredential("username", "password");
long size = CalculateFtpDirectorySize("ftp://ftp.example.com/", credentials);
이
, C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
는 또한 당신을보고 현대 MLSD
명령을 지원하는 타사 FTP 클라이언트 구현을 사용할 수 있습니다.
예를 들어 WinSCP .NET assembly은이를 지원합니다.
그리고 심지어 계산 디렉토리 크기 쉬운 일하게 편리한 Session.EnumerateRemoteFiles
방법이 있습니다
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();
}
(나는 WinSCP에의 저자 해요 :
var files = session.EnumerateRemoteFiles("/", null, EnumerationOptions.AllDirectories);
long size = files.Select(fileInfo => fileInfo.Length).Sum();
을 같이 전체 코드는 것)
왜 FTP를 선택 했습니까? 다른 프로토콜을 사용할 수 있습니까? – CodesInChaos
다른 프로토콜에 따라 나는 그것을 줄 수있다. 속도 때문에 FTP 만했습니다. – Seb