2011-10-25 2 views
3

현재 일부 파일을 내 서버에 자동 백업하도록 작은 .NET 콘솔 응용 프로그램을 만들고 있습니다. 내가 겪고있는 문제는 내게 힘든 날씨와 네트워크 중단을 가져온 것입니다. 이 시간 동안 나는 내 파일의 좋은 부분이 통과하지 못했거나 손상된 것으로 나타났습니다. 폴더 끝에 다른 크기를 가져 와서 파일 이름, 파일 수 및 총 디렉토리 크기가 일치하는지 확인하는 방법이 있는지 궁금합니다. 나는 파일을 전송할 수있는 방법으로 WinSCP와 NcFTP를 시도했지만 적절한 파일 크기를 얻는 것에 대해서는 아무 것도 보지 못했다..NET 응용 프로그램의 FTP 프로토콜에서 디렉터리 파일 크기를 얻는 방법

윈도우 전송에 꽤 많은 윈도우가 있으므로 FTP 클라이언트를 통해 크기를 줄 수있는 커맨드 라인 인수가 있다면 좋을 것입니다.

+1

왜 FTP를 선택 했습니까? 다른 프로토콜을 사용할 수 있습니까? – CodesInChaos

+0

다른 프로토콜에 따라 나는 그것을 줄 수있다. 속도 때문에 FTP 만했습니다. – Seb

답변

1

"이 디렉토리에있는 파일의 총 크기"를 요청하는 표준 방법은 없습니다. SIZE file.txt을 통해 각 파일 크기를 개별적으로 요청하거나 전체 디렉토리 중 ls -l을 요청하고 파일 크기를 파싱 할 수 있습니다.

+0

이 방법은 큰 파일이 있고 네트워크를 통해 파싱을 시도하는 디렉토리에서는 지루합니다.하지만 전반적으로 이것이 효과가있는 것 같습니다. 도와 주셔서 감사합니다. – Seb

0

최선의 방법은 전체 파일 목록을 한 번에 하나씩 보내는 것입니다. 전송 중에 연결이 실패하면 해당 파일 업로드가 실패합니다. 파일 업로드가 성공적이면 목록에서 해당 파일 이름을 제거 할 수 있습니다.

NET에서 태그를 언급 한 것처럼 아마도 C#에서 코드를 수행하는 방법에 대한 예제는 here입니다. VB.Net도 비슷하지만 아이디어를 줄 것입니다.

here과 같은 디렉터리 목록을 얻을 수 있습니다.

1

디렉토리 크기를 검색하는 표준 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(); 

을 같이 전체 코드는 것)