C# 递归恢复目录扫描

C# 递归恢复目录扫描,c#,C#,我已创建所有此目录: 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\d

我已创建所有此目录:

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等等。我正在寻找这种恢复目录扫描的能力

多谢各位


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

GetDirectory和EnumerateDirectory()都不能做我想做的事情。所以我想看看是否有人也有同样的问题: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
就这些。感谢您的时间和耐心。

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

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

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

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

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

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

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

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

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


您能发布代码的相关部分吗?将上次扫描的目录保存在某个地方,下次扫描时跳过目录直到到达。有很多方法可以做到这一点,您可能需要很多方法来完成。。您只需要将与扫描相关的信息保存到某个位置。如果没有定期删除或移动目录,只需将上次扫描的目录保存在某个地方即可。如果他们被移动了或者其他什么,你可能需要保存更多。我可以发布我的代码是的,但它工作得很好。将在另一个回复上发布。谢谢大家。我想我只需要一直做一个完整的扫描。真正的情况是扫描远程NAS的所有目录,但VPN有时会死掉。所以我必须重新开始。。。半小时就可以拿到完整的名单。这不可行。行动,继续我最后的命令。所以我想找到一种方法,继续我所处的阶段。我每天只做一次,在晚上。@user2275929我不明白我建议的方法在这种情况下是如何不起作用的。听起来你做的正是我所期望的。我添加了一个修改的选项,如果你认为会更好的话。谢谢大家。我想我必须总是做一个完整的扫描。public static void DirSearch(string _job,string _sDir,int _side){try{foreach(string _din Directory.GetDirectories(_sDir)){//这里保存到txt或其他DirSearch(_job,_d,_side);}catch(System.Exception excpt){//show error}
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