我创建了所有这个目录:
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
}
这是代码的重要部分:递归。这是get的所有目录,并忽略了拒绝访问的常见错误等。
也不是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
这就是全部。感谢您的时间和耐心。
答案 0 :(得分:2)
将特定文件指定为此程序使用的临时文件。
程序启动时,请不要扫描该临时目录中列出的任何文件。
扫描完目录后,将其添加到文件末尾。
扫描目录的所有时(或者下次运行程序时应该再次扫描它们的任何条件),擦除文件(以便它们可以是第二天再次扫描。)
另一个选择是同样的一般性想法,只是稍加修改,就是这样做:
将特定文件指定为此程序使用的临时文件。
程序启动时,如果临时文件为空,请用所有需要处理的目录填充它
浏览文件中的每个路径并进行处理
处理目录时,请将其从文件中删除