递归恢复目录扫描

本文关键字:扫描 恢复 递归 | 更新日期: 2023-09-27 18:09:36

我已经创建了所有的目录:

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

。感谢您的宝贵时间和耐心。

递归恢复目录扫描

  • 指定一个特定的文件作为这个程序使用的临时文件

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

  • 当您完成扫描目录时,将其添加到文件末尾

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

另一个选项是相同的,只是稍微修改了一下,是这样做的:

  • 指定一个特定的文件作为这个程序使用的临时文件

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

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

  • 当你处理一个目录时,从文件

  • 中删除它