0

私はこのコードを持っています:

private void SearchForDoc()
{
     try
     {
        outputtext = @"c:\temp\outputtxt";
        outputphotos = @"c:\temp\outputphotos";
        temptxt = @"c:\temp\txtfiles";
        tempphotos = @"c:\temp\photosfiles";
        if (!Directory.Exists(temptxt))
        {
            Directory.CreateDirectory(temptxt);
        }
        if (!Directory.Exists(tempphotos))
        {
            Directory.CreateDirectory(tempphotos);
        }
        if (!Directory.Exists(outputtext))
        {
            Directory.CreateDirectory(outputtext);
        }
        if (!Directory.Exists(outputphotos))
        {
            Directory.CreateDirectory(outputphotos);
        }
        t = Environment.GetEnvironmentVariable(Environment.GetFolderPath(Environment.SpecialFolder.Personal));

        ApplyAllFiles(t, ProcessFile);
        for (int i = 0; i < textfiles.Length; i++)
        {
            FileInfo fi = new FileInfo((textfiles[i]));
            DirectoryInfo d = new DirectoryInfo(temptxt);
            long dirSize = DirSize(d);

            if ((dirSize + fi.Length) <= 8388608)
                fi.CopyTo(temptxt + "\\" + fi.Name, true);
            else
                break;
        }
        Compressions("textfiles.zip", temptxt, outputtext);

問題はこの部分にあります:

for (int i = 0; i < textfiles.Length; i++)

textfilesメソッドを使用しているため、存在しなくなりましたstring[]textfilesApplyAllFiles

static void ProcessFile(string path) {/* ... */}

static void ApplyAllFiles(string folder, Action<string> fileAction)
{
    foreach (string file in Directory.GetFiles(folder))
    {
        fileAction(file);
    }
    foreach (string subDir in Directory.GetDirectories(folder))
    {
        try
        {
            ApplyAllFiles(subDir, fileAction);
        }
        catch
        {
            // swallow, log, whatever
        }
    }
}

編集**

私の方法では今私は持っています:

string t = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] textfiles = ApplyAllFiles(t, "*.txt", ProcessFile).ToArray();

次に、ApplyAllFiles メソッド:

static void ProcessFile(string path) {/* ... */}
        static IEnumerable<string> ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
        {
            foreach (string file in Directory.GetFiles(folder))
            {
                fileAction(file);
                yield return file;
            }
            foreach (string subDir in Directory.GetDirectories(folder, searchPattern))
            {
               // try
                //{
                    foreach (string file in ApplyAllFiles(subDir, searchPattern, fileAction))
                    {
                        yield return file;
                    }
               // }
               // catch
               // {
                    // swallow, log, whatever
               // }
            }
        }

try の try を削除しなければなりませんでした。

その結果、約 25 ファイルのテキストではなく、メインの dosuments ディレクトリからのみ、pdf または何かのファイルのみを取得します。

4

1 に答える 1

1

ApplyAllFiles次のように処理されたすべてのファイルのリストを取得できます。

static IEnumerable<string> ApplyAllFiles(string folder, Action<string> fileAction)
{
    IEnumerable<string> files = Directory.GetFiles(folder);
    foreach (string file in files)
    {
        fileAction(file);
    }

    foreach (string subDir in Directory.GetDirectories(folder))
    {
        try
        {
            files = files.Concat(ApplyAllFiles(subDir, fileAction));
        }
        catch
        {
            // swallow, log, whatever
        }
    }

    return files;
}

しかし、これは を返し、これをIEnumerable<string>使用string[]します:

var textfiles = ApplyAllFiles(t, ProcessFile).ToArray();

指定したアクションを特定のファイルにのみ適用するには、次のように新しいパラメーターを渡すことができます。

static IEnumerable<string> ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
{
    IEnumerable<string> files = Directory.GetFiles(folder, searchPattern);
    foreach (string file in files)
    {
        fileAction(file);
    }

    foreach (string subDir in Directory.GetDirectories(folder))
    {
        try
        {
            files = files.Concat(ApplyAllFiles(subDir, searchPattern, fileAction));
        }
        catch
        {
            // swallow, log, whatever
        }
    }

    return files;
}

var textfiles = ApplyAllFiles(t, "*.txt", ProcessFile).ToArray();

ただし、ディレクトリを再帰的に検索できるメソッドが既に存在することに注意してください。この構造全体は、おそらく次のように縮小できます。

var textfiles = Directory.GetFiles(t, "*.txt", SearchOption.AllDirectories);
foreach(var f in textfiles)
{
    ProcessFile(f);
}
于 2013-08-11T02:57:26.083 に答える