<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Adarsh's blog : FtpWebRequest</title><link>http://blogs.msdn.com/adarshk/archive/category/7225.aspx</link><description>Information related to FtpWebRequest / FtpWebResponse class and programming model</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>WebException message vs. Response.StatusDescription on FtpWebRequest</title><link>http://blogs.msdn.com/adarshk/archive/2005/05/04/414524.aspx</link><pubDate>Wed, 04 May 2005 09:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:414524</guid><dc:creator>adarshk</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/adarshk/comments/414524.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adarshk/commentrss.aspx?PostID=414524</wfw:commentRss><description>&lt;FONT size=3&gt;
&lt;P&gt;Recently one of the reader asked&amp;nbsp;an interesting question, he was using FtpWebRequest&amp;nbsp;with&amp;nbsp;MakeDirectory method, if directory already exist then application received the WebException with message.&lt;/FONT&gt;&lt;FONT size=2&gt;"The remote server returned an error: (550) File unavailable (e.g., file not found, no access).".&lt;/FONT&gt;&lt;FONT size=3&gt; This exception message appears to be very generic and not helping the user to figure out what causes this request to fail. The reason is exception messages are generally set by framework implementation, because they also need to be localized on different language versions.&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=3&gt;
&lt;P&gt;In such case if FtpWebRequest user want to diagnose and figure out why request actually failed, he could access the actual response message from server using &lt;/FONT&gt;&lt;FONT size=2&gt;((FtpWebResponse)e.Response).StatusDescription &lt;/FONT&gt;&lt;FONT size=3&gt;property. Your actual code would look like as below&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;try&lt;/FONT&gt;&lt;BR&gt;{&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;.&amp;nbsp; .&amp;nbsp; . . . . .&amp;nbsp; .&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT size=2&gt;WebResponse response = request.GetResponse();&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;&amp;nbsp;. . . . . . . . . .&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=2&gt;catch(WebException e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String status = ((FtpWebResponse)e.Response).StatusDescription;&lt;BR&gt;}&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;FONT size=2&gt;This posting is provided "AS IS" with no warranties, and confers no rights&lt;/FONT&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=414524" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adarshk/archive/tags/Net+class+library/default.aspx">Net class library</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/.Net+Frameworks+2.0/default.aspx">.Net Frameworks 2.0</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/FtpWebRequest/default.aspx">FtpWebRequest</category></item><item><title>Using FtpWebRequest to do FTP over SSL</title><link>http://blogs.msdn.com/adarshk/archive/2005/04/22/410925.aspx</link><pubDate>Fri, 22 Apr 2005 23:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:410925</guid><dc:creator>adarshk</dc:creator><slash:comments>31</slash:comments><comments>http://blogs.msdn.com/adarshk/comments/410925.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adarshk/commentrss.aspx?PostID=410925</wfw:commentRss><description>&lt;P&gt;Last few weeks we were busy to get Whidbey Beta-2 bits ready for release.&lt;/P&gt;
&lt;P&gt;If you are looking for some API where your&amp;nbsp;application could talk to a FTP server, which supports SSL. FtpWebRequest under System.Net namespace is your solution. Here I will just point to SSL specific features of the class&lt;/P&gt;
&lt;P&gt;Enabling FtpWebrequest to use Ssl is pretty simple, you just need to set EnableSsl flag before calling GetResponse() or GetRequestStream() on the FtpWebRequest object.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;FtpWebRequest request = WebRequest.Create(&lt;/FONT&gt;&lt;A href="ftp://myftpserver/dir/filename"&gt;&lt;FONT color=#808080 size=2&gt;ftp://myftpserver/dir/filename&lt;/FONT&gt;&lt;/A&gt;&lt;FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#808080&gt;);&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;request.Method = WebRequestMethods.Ftp.DownloadFile;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;request.EnableSsl = true; // Here you enabled request to use ssl instead of clear text&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;WebResponse response = request.GetResponse();&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Some people asked me why FtpWebRequest support "ftps:" protocol&amp;nbsp;based uri similar to "https:", the reason is there is no standard "ftps" scheme specified (yet) and ftp-over-ssl mechanism&amp;nbsp;actually does not demand dedicated port for ssl, you could&amp;nbsp;do it&amp;nbsp;on the same server port on which you are doing regular clear text ftp.&amp;nbsp;It depends on server configuration choice to force the SSL or allow both.&lt;/P&gt;
&lt;P&gt;Once you start doing Ftp over SSL there are two important things you will need to know&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;Validating Server Certificate&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;If you were old WebRequest user, you might already know about using ServicePointManager.CertificatePolicy for https server certificate validation. In whidbey you will notice the compiler warning saying ServicePointManager.CertificatePolicy is obsolete and replaced with ServicePointManager.ServerCertificateValidationCallback which is delegate of type RemoteCertificateValidationDelegate. New delegate provide better programming model with all certificate errors reported in a single callback and you will also get instance of X509Chain object, which allow you to make decision on certificate chain.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT size=2&gt;ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(myCertificateValidation);&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;FONT&gt;&lt;FONT color=#000000 size=2&gt;Actual method will look as below&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT&gt;&amp;nbsp;&amp;nbsp;&lt;FONT size=2&gt;public bool myCertificateValidation(Object sender, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509Certificate cert, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X509Chain chain, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SslPolicyErrors Errors)&lt;BR&gt;{ return&amp;nbsp;(certificate.GetName() == "my_trusted_name");&amp;nbsp;}; //Just an example, not real world scenaio&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;:) Another&amp;nbsp;additional advantage you can take with delegate is from anonymous method support of C# 2.0, especially if you have very simple 1-2 line certificateplicy to implement, see follwing example.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;FONT size=2&gt;ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj,&amp;nbsp;X509Certificate certificate,&amp;nbsp;X509Chain chain,&amp;nbsp;SslPolicyErrors errors)&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ return&amp;nbsp;(certificate.GetName() == "my_trusted_name");&amp;nbsp;}; //Just an example, not real world scenaio&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;Using Client Certificate&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Using Client certificate based authentication when connecting to&amp;nbsp;FTP-SSL is no different then existing HttpWebRequest. You just need to assign appropriate X509Certificate instance to the request object before making GetResponse() or GetRequestStream() call.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&lt;SPAN&gt;&lt;EM&gt;&lt;FONT size=2&gt;This posting is provided "AS IS" with no warranties, and confers no rights&lt;/FONT&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=410925" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adarshk/archive/tags/Net+class+library/default.aspx">Net class library</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/SSL/default.aspx">SSL</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/.Net+Frameworks+2.0/default.aspx">.Net Frameworks 2.0</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/FtpWebRequest/default.aspx">FtpWebRequest</category></item><item><title>Resuming broken file download with FtpWebRequest class</title><link>http://blogs.msdn.com/adarshk/archive/2004/12/01/273362.aspx</link><pubDate>Wed, 01 Dec 2004 23:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:273362</guid><dc:creator>adarshk</dc:creator><slash:comments>17</slash:comments><comments>http://blogs.msdn.com/adarshk/comments/273362.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adarshk/commentrss.aspx?PostID=273362</wfw:commentRss><description>&lt;p&gt;This post is valid for .Netframeworks 2.0&lt;/p&gt; &lt;p&gt;When we are downloading a large&amp;nbsp;file from ftp site and connection got broken in between, on next attempt you would be interested in downloading the rest of the file content instead of full file. FtpWebRequest class have a nice way to meet this requirement. You could use the FtpWebRequest.ContentOffset property to specify the starting position for file to download. See code example below&lt;/p&gt; &lt;p&gt;Following is the code for downloading the file&lt;/p&gt; &lt;p&gt;&lt;font color="#808080" size="2"&gt;public static void ResumeFtpFileDownload(Uri sourceUri, string destinationFile)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileInfo file = new FileInfo(destinationFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStream localfileStream ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FtpWebRequest request = WebRequest.Create(sourceUri) as FtpWebRequest;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.Method = WebRequestMethods.Ftp.DownloadFile;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (file.Exists)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.ContentOffset = file.Length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;localfileStream = new FileStream(destinationFile, FileMode.Append, FileAccess.Write);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;localfileStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WebResponse response = request.GetResponse();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream responseStream = response.GetResponseStream();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[] buffer = new byte[1024];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int bytesRead = responseStream.Read(buffer, 0, 1024);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (bytesRead != 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;localfileStream.Write(buffer, 0, bytesRead);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bytesRead = responseStream.Read(buffer, 0, 1024);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;localfileStream.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;responseStream .Close();&lt;br /&gt;&amp;nbsp;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080" size="2"&gt;&lt;span style="COLOR: #333333; FONT-FAMILY: 'Trebuchet MS'"&gt;&lt;em&gt;&lt;font size="2"&gt;This posting is provided "AS IS" with no warranties, and confers no rights&lt;/font&gt;&lt;/em&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=273362" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adarshk/archive/tags/Net+class+library/default.aspx">Net class library</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/.Net+Frameworks+2.0/default.aspx">.Net Frameworks 2.0</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/FtpWebRequest/default.aspx">FtpWebRequest</category></item><item><title>Sample code for parsing FtpwebRequest response for ListDirectoryDetails</title><link>http://blogs.msdn.com/adarshk/archive/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails.aspx</link><pubDate>Thu, 16 Sep 2004 03:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:230177</guid><dc:creator>adarshk</dc:creator><slash:comments>18</slash:comments><comments>http://blogs.msdn.com/adarshk/comments/230177.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adarshk/commentrss.aspx?PostID=230177</wfw:commentRss><description>&lt;FONT color=#000000&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;This posting is valid for .Net frameworks 2.0 (Currently released as Whidbey Beta1)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;ResponseStream of FtpWebResponse provides the raw data bytes to the user, s&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000&gt;ome of you had asked that it would be more useful to provide&amp;nbsp;methods which return&amp;nbsp;list of directory and files on&amp;nbsp;ListDirectory request to the server.&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#000000&gt;Current .Net frameworks doesn't support this, so&amp;nbsp;&lt;/FONT&gt;&lt;FONT color=#000000&gt;here is some sample code I had written for parsing, in general I found it works very well against most of the server. But just to make sure it is not extensively tested, so treat only as sample, its not guaranteed to work against every server.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;using System;&lt;BR&gt;using System.IO;&lt;BR&gt;using System.Net;&lt;BR&gt;using System.Collections;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Text.RegularExpressions;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public struct FileStruct&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Flags;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Owner;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Group;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public bool IsDirectory;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public DateTime CreateTime;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public string Name;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public enum FileListStyle{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UnixStyle,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WindowsStyle,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unknown&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;public class ParseListDirectory&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(args.Length &amp;lt; 1)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("\n Usage FTPListDirParser &amp;lt;uriString&amp;gt;");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FtpWebRequest ftpclientRequest = WebRequest.Create(args[0]) as FtpWebRequest;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ftpclientRequest.Method = FtpMethods.ListDirectoryDetails;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ftpclientRequest.Proxy = null;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FtpWebResponse response = ftpclientRequest.GetResponse() as FtpWebResponse;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string Datastring = sr.ReadToEnd();&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.Close();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStruct[]&amp;nbsp; list = (new ParseListDirectory()).GetList(Datastring);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine ("------------After Parsing-----------");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(FileStruct thisstruct in list)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(thisstruct.IsDirectory)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("&amp;lt;DIR&amp;gt; "+thisstruct.Name+","+thisstruct.Owner+","+thisstruct.Flags+","+thisstruct.CreateTime);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(thisstruct.Name+","+thisstruct.Owner+","+thisstruct.Flags+","+thisstruct.CreateTime);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch(Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;private FileStruct[] GetList(string datastring)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;List&amp;lt;FileStruct&amp;gt; myListArray = new List&amp;lt;FileStruct&amp;gt;();&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;string[] dataRecords = datastring.Split('\n');&lt;BR&gt;&amp;nbsp;&amp;nbsp;FileListStyle _directoryListStyle = GuessFileListStyle(dataRecords);&lt;BR&gt;&amp;nbsp;&amp;nbsp;foreach (string s in dataRecords)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (_directoryListStyle != FileListStyle.Unknown &amp;amp;&amp;amp; s != "")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileStruct f = new FileStruct();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.Name = "..";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch (_directoryListStyle)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case FileListStyle.UnixStyle:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = ParseFileStructFromUnixStyleRecord(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case FileListStyle.WindowsStyle:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = ParseFileStructFromWindowsStyleRecord(s);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(f.Name == "." || f.Name == ".."))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myListArray.Add(f);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return myListArray.ToArray(); ;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&amp;nbsp;private FileStruct ParseFileStructFromWindowsStyleRecord(string Record)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;///Assuming the record style as &lt;BR&gt;&amp;nbsp;&amp;nbsp;/// 02-03-04&amp;nbsp; 07:46PM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DIR&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Append&lt;BR&gt;&amp;nbsp;&amp;nbsp;FileStruct f = new FileStruct();&lt;BR&gt;&amp;nbsp;&amp;nbsp;string processstr = Record.Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;string dateStr = processstr.Substring(0,8);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;processstr = (processstr.Substring(8, processstr.Length - 8)).Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;string timeStr = processstr.Substring(0, 7);&lt;BR&gt;&amp;nbsp;&amp;nbsp;processstr = (processstr.Substring(7, processstr.Length - 7)).Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.CreateTime = DateTime.Parse(dateStr + " " + timeStr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;if (processstr.Substring(0,5) == "&amp;lt;DIR&amp;gt;")&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.IsDirectory = true;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;processstr = (processstr.Substring(5, processstr.Length - 5)).Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string[] strs = processstr.Split(new char[] { ' ' }, true);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;processstr = strs[1].Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.IsDirectory = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.Name = processstr; &amp;nbsp;//Rest is name&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return f;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#808080 size=2&gt;&amp;nbsp;public FileListStyle GuessFileListStyle(string[] recordList)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;foreach (string s in recordList)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(s.Length &amp;gt; 10 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; Regex.IsMatch(s.Substring(0,10),"(-|d)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)(-|r)(-|w)(-|x)"))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FileListStyle.UnixStyle;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (s.Length &amp;gt; 8 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp; Regex.IsMatch(s.Substring(0, 8),&amp;nbsp; "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return FileListStyle.WindowsStyle;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return FileListStyle.Unknown;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&amp;nbsp;private FileStruct ParseFileStructFromUnixStyleRecord(string Record)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;///Assuming record style as&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// dr-xr-xr-x&amp;nbsp;&amp;nbsp; 1 owner&amp;nbsp;&amp;nbsp;&amp;nbsp; group&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 Nov 25&amp;nbsp; 2002 bussys&lt;BR&gt;&amp;nbsp;&amp;nbsp;FileStruct f= new FileStruct();&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;string processstr = Record.Trim();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.Flags = processstr.Substring(0,9);&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.IsDirectory = (f.Flags[0] == 'd');&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;processstr =&amp;nbsp; (processstr.Substring(11)).Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;_cutSubstringFromStringWithTrim(ref processstr,' ',0); &amp;nbsp;&amp;nbsp;//skip one part&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.Owner = _cutSubstringFromStringWithTrim(ref processstr,' ',0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.Group = _cutSubstringFromStringWithTrim(ref processstr,' ',0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;_cutSubstringFromStringWithTrim(ref processstr,' ',0); &amp;nbsp;&amp;nbsp;//skip one part&lt;BR&gt;&amp;nbsp;&amp;nbsp;f.CreateTime = DateTime.Parse(_cutSubstringFromStringWithTrim(ref processstr,' ',8));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;f.Name =&amp;nbsp; processstr; &amp;nbsp;&amp;nbsp;//Rest of the part is name&lt;BR&gt;&amp;nbsp;&amp;nbsp;return f;&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private string _cutSubstringFromStringWithTrim(ref string s, char c, int startIndex)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int pos1 = s.IndexOf(c, startIndex);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string retString = s.Substring(0,pos1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = (s.Substring(pos1)).Trim();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return retString;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;SPAN style="COLOR: #333333; FONT-FAMILY: 'Trebuchet MS'"&gt;&lt;EM&gt;This posting is provided "AS IS" with no warranties, and confers no rights&lt;/EM&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=230177" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adarshk/archive/tags/Net+class+library/default.aspx">Net class library</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/.Net+Frameworks+2.0/default.aspx">.Net Frameworks 2.0</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/FtpWebRequest/default.aspx">FtpWebRequest</category></item><item><title>Understanding the basic of FtpWebRequest programming model on .Net frameworks</title><link>http://blogs.msdn.com/adarshk/archive/2004/09/13/229069.aspx</link><pubDate>Mon, 13 Sep 2004 23:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:229069</guid><dc:creator>adarshk</dc:creator><slash:comments>13</slash:comments><comments>http://blogs.msdn.com/adarshk/comments/229069.aspx</comments><wfw:commentRss>http://blogs.msdn.com/adarshk/commentrss.aspx?PostID=229069</wfw:commentRss><description>&lt;p&gt;A long standing complain from user of .Net frameworks was that it doesn't have support for popular ftp protocol. This concern is going to addressed in .Net frameworks 2.0. Recently released&amp;nbsp;Whidbey Beta-1 contains FtpWebRequest, FtpWebResponse classes to support FTP protocol. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;WebRequest/ WebResponse Model&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;.Net frameworks support for FTP protocolo is implemented on top of WebRequest/WebResponse programming model, which was part of previous versions of&amp;nbsp; .net frameworks. Here are some key&amp;nbsp;differences, later part of the document also provide some code samples to address these differences&lt;/p&gt; &lt;p&gt;a) Uri Based programming model&amp;nbsp;&lt;/p&gt; &lt;p&gt;Request/response programming model request is based on full Uri, so FtpWebRequest&amp;nbsp;user would use Uri&amp;nbsp; as compare to traditional filename and directory name based programming. Your target Uri could indicate directory name or filename depending on the ftp method&lt;/p&gt; &lt;p&gt; &lt;table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1"&gt; &lt;tbody&gt; &lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 395.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="527"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; TEXT-ALIGN: center" align="center"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;FTPMethod&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #c0c0c0; WIDTH: 225.9pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="301"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt; TEXT-ALIGN: center" align="center"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;Uri&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr style="mso-yfti-irow: 1"&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #c0c0c0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 395.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="527"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;a title="Public" href="javascript:linkToField('476160','AppendFile')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;AppendFile&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','DownloadFile')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;DownloadFile&lt;/span&gt;&lt;/a&gt; ,&lt;a title="Public" href="javascript:linkToField('476160','DeleteFile')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;DeleteFile&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','GetDateTimeStamp')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;GetDateTimeStamp&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','UploadFile')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;UploadFile&lt;/span&gt;&lt;/a&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #c0c0c0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #c0c0c0; WIDTH: 225.9pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="301"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;Uri is file name like &lt;a href="ftp://myftpserver/dir1/dir2/test.gif"&gt;ftp://myftpserver/dir1/dir2/test.gif&lt;/a&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes"&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #c0c0c0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: windowtext 1pt solid; WIDTH: 395.6pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="527"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;a title="Public" href="javascript:linkToField('476160','ListDirectory')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;ListDirectory&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','ListDirectoryDetails')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;ListDirectoryDetails&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','RemoveDirectory')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;RemoveDirectory&lt;/span&gt;&lt;/a&gt;, &lt;a title="Public" href="javascript:linkToField('476160','UploadFileWithUniqueName')" target="_self"&gt;&lt;span style="COLOR: windowtext; TEXT-DECORATION: none; mso-bidi-font-weight: bold; text-underline: none"&gt;UploadFileWithUniqueName&lt;/span&gt;&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;/td&gt; &lt;td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #c0c0c0; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #c0c0c0; WIDTH: 225.9pt; PADDING-TOP: 0in; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="301"&gt; &lt;p class="MsoNormal" style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;Uri indicates directory name like &lt;a href="ftp://myftpserver/dir1/dir2"&gt;ftp://myftpserver/dir1/dir2&lt;/a&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/o:p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p&gt;b) All Ftp Connection Management is hidden to users and internal&amp;nbsp;for users of FtpWebRequest and FtpWebResponse, each FtpWebRequest object is independent Ftp request, User should need write code for only Ftp operation he is doing, example to download file&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;FtpWebRequest request = WebRequest.Create(&amp;nbsp;"&lt;/font&gt;&lt;a href="ftp://myftpserver/dir1/dir2/test.htmf"&gt;&lt;font face="Arial" color="#808080" size="2"&gt;ftp://myftpserver/dir1/dir2/test.htmf&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;request.Credentials = new NetworkCredential("username","pass");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;WebResponse response = request.GetResponse();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;Stream dataStream = response.GetResponseStream();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;//&amp;nbsp; Now you can read stream containing the file data&lt;/font&gt;&lt;/p&gt; &lt;p&gt;c) Upoloading and downloading the data follows the standard Stream based pattern for .Net frameworks and allow user to use other stream based classes like StreamReader and StreamWriter on top of it as shown below&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;StreamReader sr = new StreamReader(responseStream, Encoding.ASCII);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;string ss = sr.ReadToEnd();&lt;/font&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;d) Some advanced feature for Ftp Requests like Ftp pver SSL and Ftp requests through http proxy tunneling are very simple to program,&lt;/p&gt; &lt;p&gt;To go via HttpProxy you can just set Proxy property on WebRequest Object like below&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;request.Proxy = new WebProxy("&lt;/font&gt;&lt;a href="http://myproxy/"&gt;&lt;font color="#808080"&gt;http://myproxy&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;");&amp;nbsp; // go through http proxy&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#808080"&gt;request.EnableSSL = true; // Your web request would use SSL channel to talk to ftp server&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Note on&amp;nbsp;using Http Proxy on FTPWebRequest: Http proxy is only supported for limited number of ftp methods (mainly to download file only), so if you have IE settings for proxy on your machine you need to explicitly set FtpWebRequest to not use proxy like below&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#808080"&gt;request.Proxy = GlobalProxySelection.GetEmptyWebProxy();&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Keep looking at this weblog for more net class library 2.0 features&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;span style="COLOR: #333333; FONT-FAMILY: 'Trebuchet MS'"&gt;&lt;em&gt;This posting is provided "AS IS" with no warranties, and confers no rights&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=229069" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/adarshk/archive/tags/Net+class+library/default.aspx">Net class library</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/.Net+Frameworks+2.0/default.aspx">.Net Frameworks 2.0</category><category domain="http://blogs.msdn.com/adarshk/archive/tags/FtpWebRequest/default.aspx">FtpWebRequest</category></item></channel></rss>