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!)
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) –
Und [Parsing FtpWebRequests ListDirectoryDetails Linie] (http://stackoverflow.com/q/1013486/850848). –
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. –