【问题标题】:C# - Directory Search not returning results for parent directoryC# - 目录搜索不返回父目录的结果
【发布时间】:2017-11-10 13:51:27
【问题描述】:

我有这个文件计数函数,它没有从我的父目录返回结果。它确实返回所有子目录的结果。在我的调试过程中,我看到父目录作为我的 Directory.GetDirectories(sDir) 传递,但是一旦它到达 Directory.GetFiles(d),它就已经更改为子目录。我正在用头撞墙。显然,它一定是我的 foreach 循环,但我没有看到它。

我传递的文件结构是:

C:\Users\xxxxx\Desktop\Temp 日志

但它有三个子目录:

C:\Users\xxxxx\Desktop\Temp Logs\sub1

C:\Users\xxxxx\Desktop\Temp Logs\sub2

C:\Users\xxxxx\Desktop\Temp Logs\sub3

有人看到我的错误吗?

     private static string fileCount(string sDir, string sfileType)
    {
        int count = 0;
        string extension;
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string file in Directory.GetFiles(d))
            {
                extension = Path.GetExtension(file);
                if (extension.ToUpper().Equals(sfileType.ToUpper()))
                {
                    TimeSpan fileAge = DateTime.Now - File.GetLastWriteTime(file);
                    if (fileAge.Days > int.Parse(ConfigurationManager.AppSettings["numberOfDays"]))
                    {
                        count++;
                    }
                }
            }
        }
        return count.ToString();
    }

【问题讨论】:

  • Directory.GetDirectories 不只返回参数的子目录吗?
  • 您期望的输出数字是多少,实际得到的是什么?
  • 正如@Casey 指出的那样,Directory.GetDirectories 不会返回父目录msdn.microsoft.com/pt-br/library/c1sez4sc(v=vs.110).aspx 为 foreach 之外的父目录放置一个额外的 Directory.GetFiles
  • 我建议进行重构,使外部“for each”内的所有代码都在一个单独的函数中。使该函数将目录作为参数,并返回计数。从那里,只需在“for each”循环之前传递父目录,然后在 for each 循环中传递每个子目录,并在执行过程中累积结果。

标签: c#


【解决方案1】:

父目录需要另一个循环,但在当前循环之外

foreach (string file in Directory.GetFiles(parent_path))
        {
            extension = Path.GetExtension(file);
            if (extension.ToUpper().Equals(sfileType.ToUpper()))
            {
                TimeSpan fileAge = DateTime.Now - File.GetLastWriteTime(file);
                if (fileAge.Days > int.Parse(ConfigurationManager.AppSettings["numberOfDays"]))
                {
                    count++;
                }
            }
        }

【讨论】:

  • 谢谢。那太容易了。我想我误解了我的目录循环在做什么。
【解决方案2】:

您在 foreach 中使用的数组仅包含子目录。添加父母和你的好去!

private static string fileCount(string sDir, string sfileType)
{
    int count = 0;
    string extension;
    List<string> directoriesToCheck = Directory.GetDirectories(sDir).ToList();
    directoriesToCheck.Add(sDir);
    foreach (string d in directoriesToCheck)
    {
        foreach (string file in Directory.GetFiles(d))
        {
            extension = System.IO.Path.GetExtension(file);
            if (extension.ToUpper().Equals(sfileType.ToUpper()))
            {
                TimeSpan fileAge = DateTime.Now - File.GetLastWriteTime(file);
                if (fileAge.Days > int.Parse(ConfigurationManager.AppSettings["numberOfDays"]))
                {
                    count++;
                }
            }
        }
    }
    return count.ToString();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多