【问题标题】:C# FTP, how to check if a Path is a File or a Directory?C# FTP,如何检查路径是文件还是目录?
【发布时间】:2011-12-26 13:30:46
【问题描述】:

我有一个包含一些 FTP 路径的数组,如下所示:

"ftp//ip/directory/directory1",
"ftp//ip/目录/目录2",
"ftp//ip/directory/file.txt",
"ftp//ip/目录/目录3",
"ftp//ip/directory/another_file.csv"

如何判断路径是文件还是目录?

提前致谢。

【问题讨论】:

  • 您可以访问服务器吗?如果是这样,怎么办?这个问题缺少很多细节。
  • 路径无法判断。
  • 如果您无权访问服务器,则使用简单的正则表达式检查路径是否具有扩展名(即 .xxx)是一种微弱但合理的方法...
  • 唯一准确的方法是连接到FTP服务器并询问它。它是唯一一个知道文件不需要具有文件扩展名的文件。更不用说目录中也可能有句点。
  • 这个问题已经很老了,但是对于任何需要回答这个问题的人来说,最好的机会是使用正则表达式和 ListDirectoryDe​​tails。整个实现在这里:http://blogs.msdn.com/b/adarshk/archive/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails.aspx

标签: c# file ftp


【解决方案1】:

我遇到了同样的问题,所以我使用 GetFileSize 来检查它是文件还是目录

var isFile = FtpHelper.IsFile("ftpURL", "userName", "password");

using System;
using System.Net;

public static class FtpHelper
{
    public static bool IsFile(Uri requestUri, NetworkCredential networkCredential)
    {
        return GetFtpFileSize(requestUri, networkCredential) != default(long); //It's a Directory if it has no size
    }
    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.
    }
    public static long GetFtpFileSize(Uri requestUri, NetworkCredential networkCredential)
    {
        //Create ftpWebRequest object with given options to get the File Size. 
        var ftpWebRequest = GetFtpWebRequest(requestUri, networkCredential, WebRequestMethods.Ftp.GetFileSize);

        try { return ((FtpWebResponse)ftpWebRequest.GetResponse()).ContentLength; } //Incase of success it'll return the File Size.
        catch (Exception) { return default(long); } //Incase of fail it'll return default value to check it later.
    }
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我根据休斯的​​答案工作。您需要像这样发出 FTPRequest:

    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    

    从流式阅读器中获取并粘贴到字符串中

    StreamReader reader = new StreamReader(responseStream);
    
                string directoryRaw = null;
    
                try { while (reader.Peek() != -1) { directoryRaw +=    reader.ReadLine() + "|"; } }
                catch (Exception ex) { Console.WriteLine(ex.ToString()); }
    

    当你打印它时,它会是这样的:

    |-rw-r--r-- 1 用户用户 1699 2015 年 6 月 1 日 404.shtml

    |drwxr-xr-x 2 user user 4096 Sep 8 19:39 cgi-bin

    |drwxr-xr-x 2 用户用户 4096 Nov 3 10:52 css

    这些由 | 分隔所以这将是分割字符串的分隔符

    如果它以 d 而不是 - 开头,那么它是一个目录,否则它是一个文件。

    这些在文件名之前的大小都相同,因此为每个从位置 62 开始到结束的字符串创建一个新字符串,这将是文件名。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我发现“hack”如何确定目标类型。 如果你会使用

      request.Method = WebRequestMethods.Ftp.GetFileSize;
      

      在文件夹上,会导致异常

      未处理的异常:System.Net.WebException:远程服务器 返回错误:(550)文件不可用(例如,找不到文件,没有 访问)。

      但是在文件上使用它,它自然会返回它的大小。

      我已经为这种方法创建了示例代码。

          static bool IsFile(string ftpPath)
          {
              var request = (FtpWebRequest)WebRequest.Create(ftpPath);
              request.Method = WebRequestMethods.Ftp.GetFileSize;
      
              request.Credentials = new NetworkCredential("foo", "bar");
              try
              {
                  using (var response = (FtpWebResponse)request.GetResponse())
                  using (var responseStream = response.GetResponseStream())
                  {
                      return true;
                  }
              }
              catch(WebException ex)
              {
                  return false;
              }
          }
      

      您可能想要更改它,因为它会捕获任何 FTP 错误。

      【讨论】:

        【解决方案4】:

        使用LIST命令,可以参考RFC959,获取指定路径下项目的详细信息。以 FileZilla Server 为例,LIST 命令将返回标准的 LINUX 权限格式,您可以找到here。第一个字母表示请求的路径是文件还是目录。还可以找到一个用 C# 编写的简单库 here

        【讨论】:

        • 究竟是如何回答问题的?
        【解决方案5】:

        一种方法是,如果我们可以假设所有文件都以扩展名结尾并且所有目录都没有扩展名,我们可以像这样使用 System.IO.Path.GetExtension() 方法:

        public bool IsDirectory(string directory)
        {
            if(directory == null)
            {
                throw new ArgumentNullException(); // or however you want to handle null values
            }
        
            // GetExtension(string) returns string.Empty when no extension found
            return System.IO.Path.GetExtension(directory) == string.Empty;
        }
        

        【讨论】:

        • 这完全不可靠。目录可以有“.”。在他们里面。
        • 这不是一个好的解决方案,文件可以不带扩展名存在,文件夹也可以带点存在
        【解决方案6】:

        您可以使用System.IO.Path.GetExtension(path)` 来检查您的路径是否具有文件扩展名。

        给定“ftp//ip/directory/directory1”或“ftp//ip/directory/directory2/”,GetExtension 将返回一个 String.Empty 给您。

        这不是万无一失的,但是如果有一个没有扩展名的文件会完全崩溃,或者一个带有句点的目录可能会导致问题。

        【讨论】:

        • 感谢您的回答。我只是想让你知道我在 FTP 服务器上有很多没有扩展名的文件。
        【解决方案7】:

        没有直接的方法。

        您可以间接假设没有句点“。”的文件名是目录,但并不总是如此。

        最好是仔细编写使用这些路径的代码,例如将路径视为目录,如果FTP服务器报错,则将其视为文件。

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 2013-03-15
          • 2013-08-14
          • 2015-07-30
          • 2012-01-15
          • 2017-08-16
          • 2010-09-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多