2011-10-25 7 views
3

現在、私のサーバー上にいくつかのファイルを自動的にバックアップする小さな.NETコンソールアプリケーションを作成しています。私が取り組んでいる問題は、いくつかの電源とネットワークの停止を招いた私の最後に悪天候があったことです。この間私は、私のファイルのかなりの部分が通過しなかったか、破損していることに気付きました。私は、もう一方の端にフォルダのサイズを取得し、ファイル名、ファイル数、および合計ディレクトリサイズが一致するかどうかを確認する方法があるかどうか疑問に思っていました。私はファイルを転送する方法としてWinSCPとNcFTPを試しましたが、適切なファイルサイズを得ることに関して何も見ていません。.NETアプリケーションのFTPプロトコルからディレクトリファイルサイズを取得する方法

これはWindows転送のかなりのウィンドウです。コマンドライン引数を使用すると、FTPクライアントを介して大きさを返すことができます。

+1

なぜFTPを選択しましたか?他のプロトコルにもオープンですか? – CodesInChaos

+0

他のプロトコルに応じて、私はそれを撃つことができます。私はスピードのためにFTPを行っただけです。 – Seb

答えて

1

「このディレクトリ内のファイルの合計サイズ」を要求する標準的な方法はありません。それぞれのファイルサイズはSIZE file.txtで個別に問い合わせることも、ディレクトリ全体のうちls -lを求めてファイルサイズを解析することもできます。

+0

この方法は、大きなファイルを持つディレクトリとネットワーク上から解析しようとすると面倒ですが、全体的にはうまくいくようです。助けてくれてありがとう。 – Seb

0

私は、あなたの最善の策は、ファイルの完全なリストを取得し、それらを一度に1つずつ送信することだと思います。転送中に接続が失敗すると、そのファイルのアップロードは失敗します。ファイルのアップロードが成功した場合は、そのファイル名をリストから削除できます。

あなたがNETであなたのタグに言及しているように、おそらくあなたはhereのようにC#でそれを行う方法の例を見てください。 VB.Netも同様ですが、それはあなたにアイデアを与えるでしょう。

hereのようにディレクトリリストを取得できます。

1

ディレクトリサイズを取得するための標準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(); 

を)

関連する問題