ftp

https://www.codeproject.com/Articles/17202/Simple-FTP-demo-application-using-C-Net

https://github.com/hgupta9/FluentFTP

http://fluentftp.codeplex.com/

https://github.com/flagbug/FlagFtp

http://enterprisedt.com/products/edtftpnet/editions/

https://code.msdn.microsoft.com/windowsapps/Windows-8-SocketsFtp-4fc23b33

https://www.codeproject.com/articles/24017/file-transfer-using-socket-application-in-c-net

https://github.com/flagbug/FlagFtp

http://netftp.codeplex.com/

http://ftps.codeplex.com/

 

https://github.com/aybe/Windows-API-Code-Pack-1.1

https://wapicp.codeplex.com/

https://github.com/dbarros/WindowsAPICodePack

https://www.codeproject.com/Articles/56321/A-Windows-FTP-Application

https://github.com/ChrisRichner/TreeViewFolderBrowser

https://www.codeproject.com/Articles/11991/An-FTP-client-library-for-NET

 

using System;
using System.IO;
using System.Net;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;


   public struct FileStruct
   {
        public string Flags;
        public string Owner;
        public string Group;
        public bool IsDirectory;
        public DateTime CreateTime;
        public string Name;
    }
   public enum FileListStyle{
        UnixStyle,
        WindowsStyle,
        Unknown  
    }


public class ParseListDirectory
{
       public static void Main(string[] args)
       {
              if(args.Length < 1)
              {
                  Console.WriteLine("\n Usage FTPListDirParser <uriString>");
                  return;
              }
              try
              {
                     FtpWebRequest ftpclientRequest = WebRequest.Create(args[0]) as FtpWebRequest;
                     ftpclientRequest.Method = FtpMethods.ListDirectoryDetails;
                     ftpclientRequest.Proxy = null;  
                     FtpWebResponse response = ftpclientRequest.GetResponse() as FtpWebResponse;
                     StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII);
                     string Datastring = sr.ReadToEnd(); 
                     response.Close();
   
                     FileStruct[]  list = (new ParseListDirectory()).GetList(Datastring);
                     Console.WriteLine ("------------After Parsing-----------");
                     foreach(FileStruct thisstruct in list)
                     { 
                            if(thisstruct.IsDirectory)
                                Console.WriteLine("<DIR> "+thisstruct.Name+","+thisstruct.Owner+","+thisstruct.Flags+","+thisstruct.CreateTime);
                            else
                                  Console.WriteLine(thisstruct.Name+","+thisstruct.Owner+","+thisstruct.Flags+","+thisstruct.CreateTime);
                     }  
           }
           catch(Exception e)
           {
                  Console.WriteLine(e);
           }
    }
 
 private FileStruct[] GetList(string datastring)
 {
  List<FileStruct> myListArray = new List<FileStruct>(); 
  string[] dataRecords = datastring.Split('\n');
  FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);
  foreach (string s in dataRecords)
  {    
   if (_directoryListStyle != FileListStyle.Unknown && s != "")
   {
    FileStruct f = new FileStruct();
    f.Name = "..";
    switch (_directoryListStyle)
    {
     case FileListStyle.UnixStyle:
      f = ParseFileStructFromUnixStyleRecord(s);
      break;
     case FileListStyle.WindowsStyle:
      f = ParseFileStructFromWindowsStyleRecord(s);
      break;
    }
    if (!(f.Name == "." || f.Name == ".."))
    {
     myListArray.Add(f);     
    }    
   }
  }
  return myListArray.ToArray(); ;
 }


 private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)
 {
  ///Assuming the record style as 
  /// 02-03-04  07:46PM       <DIR>          Append
  FileStruct f = new FileStruct();
  string processstr = Record.Trim();
  string dateStr = processstr.Substring(0,8);      
  processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();
  string timeStr = processstr.Substring(0, 7);
  processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();
  f.CreateTime = DateTime.Parse(dateStr + " " + timeStr);
  if (processstr.Substring(0,5) == "<DIR>")
  {
   f.IsDirectory = true;    
   processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();
  }
  else
  {
   string[] strs = processstr.Split(new char[] { ' ' }, true);
   processstr = strs[1].Trim();
   f.IsDirectory = false;
  }   
  f.Name = processstr;  //Rest is name   
  return f;
 }



 public FileListStyle GuessFileListStyle(string[] recordList)
 {
  foreach (string s in recordList)
  {
   if(s.Length > 10 
    && Regex.IsMatch(s.Substring(0,10),"(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))
   {
    return FileListStyle.UnixStyle;
   }      
   else if (s.Length > 8 
    && Regex.IsMatch(s.Substring(0, 8),  "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))
   {
    return FileListStyle.WindowsStyle;
   }   
  }
  return FileListStyle.Unknown;
 }


 private FileStruct ParseFileStructFromUnixStyleRecord(string Record)
 {
  ///Assuming record style as
  /// dr-xr-xr-x   1 owner    group               0 Nov 25  2002 bussys
  FileStruct f= new FileStruct();   
  string processstr = Record.Trim();        
  f.Flags = processstr.Substring(0,9);
  f.IsDirectory = (f.Flags[0] == 'd');  
  processstr =  (processstr.Substring(11)).Trim();
  _cutSubstringFromStringWithTrim(ref processstr,' ',0);   //skip one part
  f.Owner = _cutSubstringFromStringWithTrim(ref processstr,' ',0);
  f.Group = _cutSubstringFromStringWithTrim(ref processstr,' ',0);
  _cutSubstringFromStringWithTrim(ref processstr,' ',0);   //skip one part
  f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr,' ',8));     
  f.Name =  processstr;   //Rest of the part is name
  return f;
 }


     private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)
     {
            int pos1 = s.IndexOf(c, startIndex);
           string retString = s.Substring(0,pos1);
           s = (s.Substring(pos1)).Trim();
           return retString;
       }
}

  https://blogs.msdn.microsoft.com/adarshk/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails/

https://stackoverflow.com/questions/25246426/extracting-file-names-from-webrequestmethods-ftp-listdirectorydetails

string regex =
@"^" +                          //# Start of line
@"(?<dir>[\-ld])" +             //# File size          
@"(?<permission>[\-rwx]{9})" +  //# Whitespace          \n
@"\s+" +                        //# Whitespace          \n
@"(?<filecode>\d+)" +
@"\s+" +                        //# Whitespace          \n
@"(?<owner>\w+)" +
@"\s+" +                        //# Whitespace          \n
@"(?<group>\w+)" +
@"\s+" +                        //# Whitespace          \n
@"(?<size>\d+)" +
@"\s+" +                        //# Whitespace          \n
@"(?<month>\w{3})" +            //# Month (3 letters)   \n
@"\s+" +                        //# Whitespace          \n
@"(?<day>\d{1,2})" +            //# Day (1 or 2 digits) \n
@"\s+" +                        //# Whitespace          \n
@"(?<timeyear>[\d:]{4,5})" +    //# Time or year        \n
@"\s+" +                        //# Whitespace          \n
@"(?<filename>(.*))" +          //# Filename            \n
@"$";                           //# End of line


var split = new Regex(regex).Match(line);
string dir = split.Groups["dir"].ToString();
string filename = split.Groups["filename"].ToString();
bool isDirectory = !string.IsNullOrWhiteSpace(dir) && dir.Equals("d", StringComparison.OrdinalIgnoreCase);

  

posted @ 2017-07-24 15:22  ®Geovin Du Dream Park™  阅读(170)  评论(0)    收藏  举报