【问题标题】:Recursively resume directory scan递归恢复目录扫描
【发布时间】:2013-04-19 16:50:48
【问题描述】:

我已经创建了所有这个目录:

dirdemojob3: C:\temp\dirdemo\dir01
dirdemojob3: C:\temp\dirdemo\dir01\dir0101
dirdemojob3: C:\temp\dirdemo\dir01\dir0102
dirdemojob3: C:\temp\dirdemo\dir01\dir0102\dir010201
dirdemojob3: C:\temp\dirdemo\dir02
dirdemojob3: C:\temp\dirdemo\dir02\dir0201
dirdemojob3: C:\temp\dirdemo\dir03
dirdemojob3: C:\temp\dirdemo\dir03\apalqoei
dirdemojob3: C:\temp\dirdemo\dir03\xpt01

程序递归搜索目录并且运行良好。

如果扫描遇到错误,例如在“dir02\dir0201”中,它会停止扫描。我想在程序的另一次运行或第二天开始扫描,但不要从 dir01 开始。我想在“dir02\dir0201”中恢复并像正常扫描一样继续。

如果您从“dir02\dir0201”重新开始,则不会扫描 dir03 等等。我正在寻找恢复目录扫描的能力。

谢谢。


    public static void DirSearch(string _job, string _sDir, int _side)
    {
        try
        {
            foreach (string _d in Directory.GetDirectories(_sDir))
            {
               // here save to txt or anything else
                DirSearch(_job, _d, _side);
            }
        }
        catch (System.Exception excpt)
        {
              // show error
        }

这是代码的重要部分:递归。此获取所有目录并忽略访问被拒绝等常见错误。

GetDirectories 和 EnumerateDirectories (http://msdn.microsoft.com/en-us/library/dd383573.aspx) 也没有能力做我想做的事。所以我想看看是否有人遇到了同样的问题:getdirectories() 并能够在 vpn 掉线或另一天恢复。

编辑:感谢 ChrisF 的编辑。

无论如何,这段代码很有用,但我的问题没有直接的解决方案。我正在编写一个函数来做我需要的事情,稍后会在这里发布。

// **************************

更新:我不知道如何以其他方式添加,所以就这样吧。

接下来的代码读取目录并将其保存到 sql server 并在控制台上写入一些信息。它是一个递归函数,但它以一种特殊的方式控制关卡。 这种方式可用于进行文件扫描以进行备份或重新同步并恢复作业,如果它无论如何都失败了。 我发现无法恢复目录搜索。但是您始终可以获取完整列表,然后根据保存的列表备份文件。这样,您就可以随时恢复工作。

public static void DirSearchByLevel(string _job, string _sDir, int _side)
{
    //
    // verify that root dir exists
    // code here
    if (!Directory.Exists(_sDir)) { KONSOLE("Directory does not exists: " + _sDir); return; }
    //
    // save root dir - complete 0 (not yet); dirlevel = 0 (root of search directory)
    KONSOLE("Scanning " + _sDir + " - complete=" + _complete.ToString() + " level=" + _dirlevel.ToString());
    errodb = tools.SaveDirToDB(_job, _side, _sDir,
                                      DateTime.MinValue, DateTime.MinValue, DateTime.MinValue,
                                      _complete, _dirlevel);
    //
    // save base dir - complete 0 (not yet); dirlevel = 1 (base of search directory)
    // *****************************************************************************
    try
    {
        foreach (string _d in Directory.EnumerateDirectories(_sDir, "*.*", SearchOption.TopDirectoryOnly))
        {
            //KONSOLE(_d);
            errodb = tools.SaveDirToDB(_job, _side, _d,
                                       DateTime.MinValue, DateTime.MinValue, DateTime.MinValue,
                                       _complete, _dirlevel);
            // get dirlevel +1 to scan next level; recursion will downlevel it next
            _dirlevel += 1;
            DirSearchByLevel(_job, _d, _side);
        }
        // if none directory was found, we still at 0; otherwise, go back one level
        if (0 != _dirlevel) _dirlevel -= 1;
        // *****************************************************************************
        //
        // save base dir; complete = 1;
        _complete = 1;
        errodb = tools.UpdateDir(_job, _side, _sDir, _complete, _dirlevel);
        KONSOLE("Update " + _sDir + " - complete=" + _complete.ToString() + " level=" + _dirlevel.ToString());
    }
    catch (Exception exp)
    {
        KONSOLE("Error in " + _sDir + " - complete=" + _complete.ToString() + " level=" + _dirlevel.ToString());
    }
}

这是这个函数的演示结果:

Scanning C:\temp\dirdemo - complete=0 level=0 Scanning
C:\temp\dirdemo\dir01 - complete=0 level=1 Scanning
C:\temp\dirdemo\dir01\dir0101 - complete=0 level=2 Update
C:\temp\dirdemo\dir01\dir0101 - complete=1 level=1 Scanning
C:\temp\dirdemo\dir01\dir0102 - complete=1 level=2 Scanning
C:\temp\dirdemo\dir01\dir0102\dir010201 - complete=1 level=3 Update
C:\temp\dirdemo\dir01\dir0102\dir010201 - complete=1 level=2 Update
C:\temp\dirdemo\dir01\dir0102 - complete=1 level=1 Update
C:\temp\dirdemo\dir01 - complete=1 level=0 Scanning
C:\temp\dirdemo\dir02 - complete=1 level=1 Scanning
C:\temp\dirdemo\dir02\dir0201 - complete=1 level=2 Update
C:\temp\dirdemo\dir02\dir0201 - complete=1 level=1 Update
C:\temp\dirdemo\dir02 - complete=1 level=0 Scanning
C:\temp\dirdemo\dir03 - complete=1 level=1 Scanning
C:\temp\dirdemo\dir03\apalqoei - complete=1 level=2 Update
C:\temp\dirdemo\dir03\apalqoei - complete=1 level=1 Scanning
C:\temp\dirdemo\dir03\xpt01 - complete=1 level=2 Update
C:\temp\dirdemo\dir03\xpt01 - complete=1 level=1 Update
C:\temp\dirdemo\dir03 - complete=1 level=0 Update C:\temp\dirdemo -
complete=1 level=0

就是这样。感谢您的时间和耐心。

【问题讨论】:

  • 你能发布你的代码的相关部分吗?
  • 将上次扫描的目录保存在某处,并在下次扫描时跳过目录,直到到达那里。
  • 有很多方法可以做到这一点,而且您可能需要很多方法来完成它。您只需将与您的扫描相关的信息保存在某处。如果没有定期删除或移动目录,请始终将最后扫描的目录保存在某处。如果它们被移动或其他原因,您可能需要保存更多。
  • 我可以发布我的代码,是的,但效果很好。将在另一个回复中发布。
  • 谢谢大家。我想我只需要始终进行全面扫描。

标签: c#


【解决方案1】:
  • 将特定文件指定为该程序使用的临时文件。

  • 程序启动时,不要扫描该临时目录中列出的任何文件。

  • 完成扫描目录后,将其添加到文件末尾。

  • 当您完成扫描所有目录(或任何表明下次运行程序时应再次扫描它们的条件)时,擦除文件(以便它们可以被第二天再次扫描)。

另一个与一般想法相同但稍作修改的选项是这样做:

  • 将特定文件指定为该程序使用的临时文件。

  • 程序启动时,如果临时文件为空,则填充所有需要处理的目录

  • 遍历文件中的每个路径并进行处理

  • 处理目录时,将其从文件中删除

【讨论】:

  • 真实情况是扫描远程NAS的所有目录但VPN有时会死掉。所以我必须重新开始……半小时才能得到整个清单。这不切实际。
  • 操作,继续我的最后一个命令。所以我想找到一种方法来继续我的观点。我每天晚上只做一次。
  • @user2275929 我看不出我建议的方法在这种情况下如何运作良好。听起来你正在做我所期望的。如果您认为它会更好,我添加了一个修改选项。
  • 谢谢大家。我想我只需要始终进行全面扫描。
  • public static void DirSearch(string _job, string _sDir, int _side) { try { foreach (string _d in Directory.GetDirectories(_sDir)) { // 这里保存到 txt 或其他任何内容 DirSearch(_job , _d, _side); } } catch (System.Exception excpt) { // 显示错误 }
猜你喜欢
  • 2012-11-30
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2014-10-13
  • 2014-09-30
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多