C# 从递归方法获取结果列表
我有以下代码:C# 从递归方法获取结果列表,c#,winforms,recursion,C#,Winforms,Recursion,我有以下代码: private void SearchForDoc() { try { outputtext = @"c:\temp\outputtxt"; outputphotos = @"c:\temp\outputphotos"; temptxt = @"c:\temp\txtfiles"; tempphotos = @"c:\temp\photosfiles"; if (!Director
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);
编辑**
在我现在的方法中,我有:
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
// }
}
}
staticvoidprocessfile(字符串路径){/*…*/}
静态IEnumerable应用程序文件(字符串文件夹、字符串搜索模式、操作文件操作)
{
foreach(Directory.GetFiles(文件夹)中的字符串文件)
{
文件操作(文件);
生成返回文件;
}
foreach(Directory.GetDirectories(文件夹,搜索模式)中的字符串subDir)
{
//试一试
//{
foreach(ApplyAllFiles中的字符串文件(subDir、searchPattern、fileAction))
{
生成返回文件;
}
// }
//抓住
// {
//燕子,圆木,随便什么
// }
}
}
必须取消试捕产量不能进行试捕
其次,我还在第二个内部foreach循环中添加了searchPatterns变量
结果是,我只收到pdf或其他文件,而不是25个文件的文本,并且只从主dosuments目录获得。您可以获得由
ApplyallFile处理的所有文件的列表,如下所示:
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;
}
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();
要仅将指定的操作应用于某些文件,可以传入如下新参数:
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;
}
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();
p、 s.w.g正在处理一个小的子问题,如果我只想从ApplyallFiles中获取文本文件,而不是所有文件都只获取文本文件?@DanielVest如何确定它是否是文本文件?我需要“*.txt”我想过滤列表中只包含文本文件。因此ApplyallFiles最终将返回一个只包含文本文件的列表。@DanielVest好的最后一个问题,是否要将ProcessFile
应用于所有文件并仅返回文本文件,还是只将ProcessFile
应用于文本文件?
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);
}