2016-08-31 1 views
1

Der Ausgang für FTP.ListDirectoryDetails oft ist eine Zeichenfolge, ähnlich den unten angegeben:Wie ordne ich die reponse für FTP.ListDirectoryDetails zu einem Objekt

-rw-r - r-- 1 ftp ftp 960 Aug 31 09:09 test1.xml

Wie konvertiere ich dies in ein Objekt, das einfach zu bedienen ist?

+0

Mögliches Duplikat von [C# -Klasse, um WebRequestMethods.Ftp.ListDirectoryDetails FTP-Antwort zu analysieren] (http://stackoverflow.com/questions/7060983/c-sharp-class-to-parse-webrequestmethods-ftp -listdirectorydetails-ftp-response) –

+0

Und [Parsing FtpWebRequests ListDirectoryDetails Linie] (http://stackoverflow.com/q/1013486/850848). –

+1

Nicht, dass irgendwelche von ihnen eine anständige Antwort haben. Aber Sie sollten Ihre Antwort auf einige von ihnen geschrieben haben, anstatt eine neue Frage zu beginnen. –

Antwort

1

Ich konnte keine vernünftige Lösung für die Umwandlung in ein nützliches Objekt finden, also habe ich mein eigenes erstellt. Ich hoffe, der folgende Code hilft jemand anderem. Wenn Sie Vorschläge zur Verbesserung dieses Codes haben, können Sie gerne einen Beitrag leisten. Hier

ist die Klasse:

/// <summary> 
/// This class represents the file/directory information received via FTP.ListDirectoryDetails 
/// </summary> 
public class ListDirectoryDetailsOutput 
{ 
    public bool IsDirectory { get; set; } 
    public bool IsFile { 
     get { return !IsDirectory; } 
    } 

    //Owner permissions 
    public bool OwnerRead { get; set; } 
    public bool OwnerWrite { get; set; } 
    public bool OwnerExecute { get; set; } 

    //Group permissions 
    public bool GroupRead { get; set; } 
    public bool GroupWrite { get; set; } 
    public bool GroupExecute { get; set; } 

    //Other permissions 
    public bool OtherRead { get; set; } 
    public bool OtherWrite { get; set; } 
    public bool OtherExecute { get; set; } 

    public int NumberOfLinks { get; set; } 
    public int Size { get; set; } 
    public DateTime ModifiedDate { get; set; } 
    public string Name { get; set; } 

    public bool ParsingError { get; set; } 
    public Exception ParsingException { get; set; } 

    /// <summary> 
    /// Parses the FTP response for ListDirectoryDetails into the Output object 
    /// An example input of a file called test1.xml: 
    /// -rw-r--r-- 1 ftp ftp   960 Aug 31 09:09 test1.xml 
    /// </summary> 
    /// <param name="ftpResponseLine"></param> 
    public ListDirectoryDetailsOutput(string ftpResponseLine) 
    { 
     try 
     { 
      string[] responseList = ftpResponseLine.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); 

      string permissions = responseList[0]; 
      //Get directory, currently only checking for not "-", might be beneficial to also check for "d" when mapping IsDirectory 
      IsDirectory = !string.Equals(permissions.ElementAt(0), '-'); 

      //Get directory, currently only checking for not "-", might be beneficial to also check for r,w,x when mapping permissions 
      //Get Owner Permissions 
      OwnerRead = !string.Equals(permissions.ElementAt(1), '-'); 
      OwnerWrite = !string.Equals(permissions.ElementAt(2), '-'); 
      OwnerExecute = !string.Equals(permissions.ElementAt(3), '-'); 

      //Get Group Permissions 
      GroupRead = !string.Equals(permissions.ElementAt(4), '-'); 
      GroupWrite = !string.Equals(permissions.ElementAt(5), '-'); 
      GroupExecute = !string.Equals(permissions.ElementAt(6), '-'); 

      //Get Other Permissions 
      OtherRead = !string.Equals(permissions.ElementAt(7), '-'); 
      OtherWrite = !string.Equals(permissions.ElementAt(8), '-'); 
      OtherExecute = !string.Equals(permissions.ElementAt(9), '-'); 

      NumberOfLinks = int.Parse(responseList[1]); 

      Size = int.Parse(responseList[4]); 
      string dateStr = responseList[5] + " " + responseList[6] + " " + responseList[7]; 
      //Setting Year to the current year, can be changed if needed 
      dateStr += " " + DateTime.Now.Year.ToString(); 

      ModifiedDate = DateTime.ParseExact(dateStr, "MMM dd hh:mm yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces); 

      Name = (responseList[8]); 
      ParsingError = false; 
     } 
     catch (Exception ex) 
     { 
      ParsingException = ex; 
      ParsingError = true; 
     } 
    } 
} 

Und hier ist, wie ich es verwenden:

  // Get the object used to communicate with the server. 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FTPURL); 
      request.Credentials = new NetworkCredential(FTPUsername, FTPPassword); 
      //Only required for SFTP 
      //request.EnableSsl = true; 
      request.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 

      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
      StreamReader streamReader = new StreamReader(response.GetResponseStream()); 

      List<ListDirectoryDetailsOutput> directories = new List<ListDirectoryDetailsOutput>(); 

      string line = streamReader.ReadLine(); 
      while (!string.IsNullOrEmpty(line)) 
      { 
       directories.Add(new ListDirectoryDetailsOutput(line)); 
       line = streamReader.ReadLine(); 
      } 

      streamReader.Close(); 

Bitte beachten Sie: Dies funktioniert nur, wenn die Eingabezeichenfolge ist genau im gleichen Format. Wenn nicht, wird ParsingError wahr und die Ausnahme wird als ParsingException abgefangen.

Hinweis 2: Dateien älter als 1 Jahr haben das Format MMM TT JJJJ, nicht MMM TT HH: MM. Dies erfordert einige Verbesserungen im obigen Code. Fehlendes Jahr bedeutet nicht immer aktuelles Jahr (Code wird falsch angenommen). Fehlendes Jahr bedeutet nur innerhalb des letzten Jahres. Wenn Sie eine Datei im April mit dem Datum 20. Dezember erhalten, würde fehlendes Jahr letztes Jahr bedeuten, nicht dieses Jahr. (Danke Martin!)

+1

Dies wird nicht funktionieren 1) Wenn der Server überhaupt keine * nix-style Auflistung verwendet 2) Typische Dateien älter als 1 Jahr haben das Zeitformat 'MMM dd yyyy', nicht' MMM dd hh: mm'. 3) Fehlendes Jahr kann das letzte Jahr sein, nicht das aktuelle Jahr, wenn man sagt, es ist jetzt April, und das Datum in der Auflistung ist 'Dec 20'. 4) Einige Server unterstützen Benutzer-/Gruppennamen mit Leerzeichen (insbesondere Windows). –

+0

Tolle Punkte! Ich habe bereits das genaue Format notiert, für das dies funktionieren würde, und dass andere Formate einige Feinabstimmungen erfordern würden. Ich habe zusätzliche Notizen über das Zeitformat und das fehlende Jahr hinzugefügt. –

Verwandte Themen