-3

このディレクトリをすべて作成しました:

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 サーバーに保存し、コンソールに情報を書き込みます。これは再帰関数ですが、特別な方法でレベルを制御します。この方法を使用して、バックアップまたは再同期のためのファイル スキャンを実行し、いずれにせよ失敗した場合にジョブを再開できます。ディレクトリ検索を再開できないことがわかりました。ただし、いつでも完全なリストを取得して、保存したリストに基づいてファイルをバックアップできます。これにより、いつでもジョブを再開できます。

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

それで全部です。お時間をいただき、ありがとうございます。

4

1 に答える 1

2
  • 特定のファイルを、このプログラムが使用する一時ファイルとして指定します。

  • プログラムの起動時に、その一時ディレクトリにリストされているファイルをスキャンしないでください。

  • ディレクトリのスキャンが終了したら、それをファイルの末尾に追加します。

  • すべてのディレクトリのスキャンが終了したら(または、次回プログラムを実行するときに再度スキャンする必要があることを示す条件が何であれ)、ファイルをワイプします (翌日に再度スキャンできるようにします)。

わずかに変更された、同じ一般的なアイデアである別のオプションは、これを行うことです。

  • 特定のファイルを、このプログラムが使用する一時ファイルとして指定します。

  • プログラムの起動時に、一時ファイルが空の場合は、処理する必要があるすべてのディレクトリを入力します

  • ファイル内の各パスを調べて処理します

  • ディレクトリを処理するときは、ファイルから削除します

于 2013-04-17T19:17:02.757 に答える