【问题标题】:Extracting file names from WebRequestMethods.Ftp.ListDirectoryDetails从 WebRequestMethods.Ftp.ListDirectoryDe​​tails 中提取文件名
【发布时间】:2014-10-04 11:13:00
【问题描述】:

我有一个应用程序,它执行以下操作:目录列表、下载文件、全部下载。

我在从 WebRequestMethods.Ftp.ListDirectoryDe​​tails 获取文件名时遇到问题。似乎不可能对每个场景都这样做。

WebRequestMethods.Ftp.ListDirectoryDe​​tails 以下列方式返回一个 lineItem:

"-rw-r--r-- 1 ftp ftp 39979 Aug 01 16:02 db to pc 2014-08-05 07-30-00.csv"

我使用第一个字符来确定它是文件还是目录。然后我在空间上拆分文件并在拆分内固定索引量后获取文件名。我的实现中的问题是,如果一个文件有多个空格,那么它将被错误地引用为更少的空格,并且在尝试下载它时将找不到该文件。

我不能使用 split.last(),因为文件名可以有空格,也不能使用 WebRequestMethods.Ftp.ListDirectory,因为它不允许我们区分目录和没有扩展名的文件。也不是正则表达式,因为文件名中可以​​包含日期。寻找完全涵盖所有情况的解决方案的任何帮助都会很棒。

bool isDirectory = line.Substring(0,1).Equals("d", System.StringComparison.OrdinalIgnoreCase);

string[] itemNames = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries).Select((value, index) => new { value, index }).Where(i => i.index > 7).Select(i => i.value).ToArray();
string val = string.Join(" ", itemNames);

【问题讨论】:

    标签: c# .net ftp ftpwebrequest ftpwebresponse


    【解决方案1】:

    最终的解决方案是使用正则表达式并使用组进行拆分。这解决了所有问题,并允许我获取文件/目录名称以及它是目录还是文件。

    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);
    

    感谢:http://blogs.msdn.com/b/adarshk/archive/2004/09/15/sample-code-for-parsing-ftpwebrequest-response-for-listdirectorydetails.aspx 提供正则表达式。

    【讨论】:

    • 我无法通过使用 WebRequestMethods.Ftp.ListDirectoryDe​​tails 获取权限详细信息。我是否需要提供权限才能获取文件/文件夹的权限详细信息。请协助。
    【解决方案2】:

    更简单的解决方案可能是:

    isDirectory=line[0]=='d'; 
    filename = line.Split(new char[] {' '}, 9,StringSplitOptions.RemoveEmptyEntries)[8]
    

    【讨论】:

    • 这太棒了。简短而简单。谢谢你。
    【解决方案3】:

    基于Sasa's suggestion,可以使用以下代码获取文件列表。

    List<string> availableFiles = new List<string>();
    string line = string.Empty;
    
    ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
    using (FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse())
    {
        using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
        {
            line = streamReader.ReadLine();
            while (!string.IsNullOrEmpty(line))
            {
                if (line[0] != 'd')
                {
                    availableFiles.Add(line.Split(new char[] { ' ' }, 9, StringSplitOptions.RemoveEmptyEntries)[8]);
                }
    
                line = streamReader.ReadLine();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 2021-08-31
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2016-06-19
      • 2018-10-24
      相关资源
      最近更新 更多