如何在 C# 中使用 FTP 列出目录内容?

Posted

技术标签:

【中文标题】如何在 C# 中使用 FTP 列出目录内容?【英文标题】:How to List Directory Contents with FTP in C#? 【发布时间】:2011-03-18 22:55:10 【问题描述】:

我使用下面的代码通过 FTP 列出目录内容,它以 XML 格式返回结果,但我只想要目录的名称而不是全部内容。

我该怎么做?

public class WebRequestGetExample

    public static void Main ()
    
        // Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/");
        request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

        // This example assumes the FTP site uses anonymous logon.
        request.Credentials = new NetworkCredential ("anonymous","janeDoe@contoso.com");

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();

        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        Console.WriteLine(reader.ReadToEnd());

        Console.WriteLine("Directory List Complete, status 0", response.StatusDescription);

        reader.Close();
        response.Close();
    

MSDN

【问题讨论】:

我会使用 NameSearchCondition(".", SearchConditionFileTypes.Directory) 作为ultimate ftp 的搜索条件参数 ListDirectory 方法。请参阅此示例:componentpro.com/doc/ftp/… 【参考方案1】:

试试这个:

FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpRequest.Credentials =new NetworkCredential("anonymous","janeDoe@contoso.com");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());

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

string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))

    directories.Add(line);
    line = streamReader.ReadLine();


streamReader.Close();

它给了我一个目录列表...全部列在目录字符串列表中...告诉我这是否是您需要的

【讨论】:

嗨,您的代码以 XML 格式返回结果我只想要远程系统目录,因为我需要将该目录名称绑定到树视图。获取 XML 对我不起作用。 @swapnil 我上面的代码(我编辑过的)对你有用吗?只是好奇 它返回给我 proxy-1.lge.net:8080/squid-internal-static/icons/…" ALT="[DIR] "> Swapnil. . . . . . . . . . . . . Jul 21 09:43 其中“Swapnil”是目录的名称。我不希望所有其他的东西只是我必须在树视图中显示的目录的名称。我无法在树视图中显示所有这些细节。有什么建议或修改吗? @Swapnil Gupta,你得到 html 的结果不是代码的错,而是你的 FTP 服务器的设置。 @mint hi mint 我试过你的代码,但我得到一个错误的对象名称:'System.Net.Sockets.NetworkStream'。【参考方案2】:

您可能正在寻找PrintWorkingDirectory

【讨论】:

当我使用 PrintWorkingDirectory 时出现错误:“使用 HTTP 代理时不支持请求的 FTP 命令” FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(uri); ftpRequest.Credentials = new NetworkCredential("...", "..."); ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse 响应 = (FtpWebResponse)ftpRequest.GetResponse(); //错误 StreamReader streamReader = new StreamReader(response.GetResponseStream());字符串 sResult = streamReader.ReadToEnd(); streamReader.Close(); 尝试在您的代码中将 ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory 更改为 ftpRequest.Method = WebRequestMethods.Ftp.PrintWorkDirectory... @monO : "使用 HTTP 代理时不支持请求的 FTP 命令" 。这个异常我正在上线“FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();”【参考方案3】:

您需要列出目录内容的ListDirectory

编辑:或者你可以使用这个 Chilkat 库,它为你很好地包装了它

【讨论】:

ListDirectory 也以 XML 格式列出结果。我只想要远程系统目录,因为我需要将该目录名称绑定到树视图。获取 XML 对我不起作用。谢谢。 是的,我浏览了 Chilkat 图书馆,但我不想使用任何第 3 方。谢谢。您还有其他建议吗? 我认为它只会返回 xml,但我可能是错的。除非您可以指定 httpwebresponse 返回纯文本,否则您可能只需要将 xml 解析为文本?【参考方案4】:

一些代理会重新格式化目录列表,因此很难可靠地解析目录列表,除非你能保证代理不会改变

【讨论】:

【参考方案5】:

获取 FTP 目录内容的最简单、最有效的方法:

var contents = GetFtpDirectoryContents(new Uri("ftpDirectoryUri"), new NetworkCredential("userName", "password"));

    public static List<string> GetFtpDirectoryContents(Uri requestUri, NetworkCredential networkCredential)
    
        var directoryContents = new List<string>(); //Create empty list to fill it later.
        //Create ftpWebRequest object with given options to get the Directory Contents. 
        var ftpWebRequest = GetFtpWebRequest(requestUri, networkCredential, WebRequestMethods.Ftp.ListDirectory);
        try
        
            using (var ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse()) //Excute the ftpWebRequest and Get It's Response.
            using (var streamReader = new StreamReader(ftpWebResponse.GetResponseStream())) //Get list of the Directory Contentss as Stream.
            
                var line = string.Empty; //Initial default value for line.
                do
                
                    line = streamReader.ReadLine(); //Read current line of Stream.
                    directoryContents.Add(line); //Add current line to Directory Contentss List.
                 while (!string.IsNullOrEmpty(line)); //Keep reading while the line has value.
            
        
        catch (Exception)   //Do nothing incase of Exception occurred.
        return directoryContents; //Return all list of Directory Contentss: Files/Sub Directories.
    

    public static FtpWebRequest GetFtpWebRequest(Uri requestUri, NetworkCredential networkCredential, string method = null)
    
        var ftpWebRequest = (FtpWebRequest)WebRequest.Create(requestUri); //Create FtpWebRequest with given Request Uri.
        ftpWebRequest.Credentials = networkCredential; //Set the Credentials of current FtpWebRequest.

        if (!string.IsNullOrEmpty(method))
            ftpWebRequest.Method = method; //Set the Method of FtpWebRequest incase it has a value.
        return ftpWebRequest; //Return the configured FtpWebRequest.
    

【讨论】:

【参考方案6】:

在下面的链接中有一个方法 GetDirectoryInformation() 从 FTP 目录中递归获取文件和目录。

Getting files from FTP directory recursively

【讨论】:

【参考方案7】:

如果你想列出 de 目录中的文件名,你必须把 (reqFTP.Proxy = null;) 在调用 (reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;) 之前。

希望对你有帮助!

【讨论】:

以上是关于如何在 C# 中使用 FTP 列出目录内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用FluentFTP列出文件夹

有没有办法在 ftp 中列出本地目录的内容?

如何使用 C# 在 FTP 服务器上创建目录?

ftp上传问题,

如何使用 Cyrillic 字体列出文件夹的内容?

关于内网用户访问外网ftp的问题:无法列出目录