gpt4 book ai didi

c# - 为同一行文本 C# 读取不同子文件夹中的特定文件

转载 作者:行者123 更新时间:2023-11-30 20:15:54 24 4
gpt4 key购买 nike

我目前正在创建一个简短的控制台应用程序来读取多个子文件夹中的特定文件。该文件在所有目录中都具有相同的名称,因此将它们全部移动到一个目录并重命名它们将是一件非常麻烦的事情(这些文件超过 365 个。它们每天自动创建一个新名称,并返回几个年)。但是,它们都在同一个主文件夹下。

我调查了 Read all files in directory sub folders 。我知道我能够搜索每个单独的子文件夹并查看所有文件(我能够将它们的 fileName 显示到控制台,以便在我的 foreach 语句中找到每个文件。

到目前为止的代码:

static void Main(string[] args)
{
string readLine = string.Empty;
var dir = new DirectoryInfo(@"C:\MotherDir\");
// foreach loop to go through each subfolder to find FileINeed.txt
foreach (var file in dir.EnumerateFiles("FileINeed.txt", SearchOption.AllDirectories))
{
//I get an error here: "System.IO.FileNotFoundException: 'Could not file file-'"
using (StreamReader sr = new StreamReader(file.ToString())) //this is using the wrong directory, not the one set previously (var dir)
{
while (!sr.EndOfStream)
{
readLine = sr.ReadLine();

ProcessFiles(file.ToString());
}
}
}

Console.WriteLine("Finished.");
Console.ReadKey(); //Gets pause at the end of the program
}

// Method to pass files through in order to search for specific string
static fileEntry ProcessFiles(string fileName)
{
fileEntry inputFiles = new fileEntry();

string fileString = string.Empty;
string readLine;
using (StreamReader sr = new StreamReader(fileName))
{
while (!sr.EndOfStream)
{
readLine = sr.ReadLine();

if (readLine.Length < 1)
{
}

if (readLine.Contains("RUN DATE: "))
{
Console.Write("RUN DATE: ");
Console.WriteLine(readLine);
}
if (readLine.Contains("1234567"))
{
Console.Write("Found this: ");
Console.WriteLine(readLine);
}
if (readLine.Contains("7654321"))
{
Console.Write("Found this: ");
Console.WriteLine(readLine);
}
if (readLine.Contains("1346785"))
{
Console.Write("Found this: ");
Console.WriteLine(readLine);
}
if (readLine.Contains("2589632"))
{
Console.Write("Found this: ");
Console.WriteLine(readLine);
}
if (readLine.Contains("12587412"))
{
Console.Write("Found this: ");
Console.WriteLine(readLine);
}
}
}

inputFiles.FileName = fileString;
return inputFiles;
}


public class fileEntry
{
//stores file names and datetimes
public string FileName { get; set; }

public DateTime FileDate { get; set; }
}

对于寻找特定字符串的糟糕的 if 语句,我深表歉意,我试图使用 switch/case 语句,但无法让它工作。

我只需要它在找到其中一个字符串时输出到控制台窗口(我知道我正在尝试输出整个 readLine)。该程序的目的是查看这些字符串是否存在于正在处理的文件中。

我对 C# 还是很陌生,这是我从头开始编写的第一个有值(value)的程序。因此,对于我仍在学习的不良编码实践(如果有的话),我深表歉意!如果您有任何建议或帮助,我们将不胜感激!如果我需要澄清任何事情,请告诉我!

提前致谢!

最佳答案

您在那里不必要地使用 StreamReader,您应该将它传递给您的 ProcessFiles(不是 file.ToString() 而是 file.FullName,它是文件的全名和路径 - 其他是 FileInfo 对象):

// foreach loop to go through each subfolder to find FileINeed.txt
foreach (var file in dir.EnumerateFiles("FileINeed.txt", SearchOption.AllDirectories))
{
//I get an error here: "System.IO.FileNotFoundException: 'Could not file file-'"
ProcessFiles(file.FullName);
}

注意:很难理解 ProcessFiles 的用途。即:为什么在处理新类(class)时要返回文件?在您第一次获取列表时,您已经有了它们。

注意 2:顺便说一句,使用 dir.EnumerateFiles 或 dir.GetFiles 是比使用 Directory.GetFiles 更好的选择,尤其是当您还想过滤其他文件属性(如(CreationDate、ModificationDate ...)时)。

另一个例子:

void Main()
{
string[] searches = { "RUN DATE: ", "1234567", "7654321", "1346785", "2589632", "12587412"};

var dir = new DirectoryInfo(@"C:\MotherDir\");
var files = from fi in dir.GetFiles("FileINeed.txt", SearchOption.AllDirectories)
let content = File.ReadAllText(fi.FullName)
// sample filter
// where fi.CreationTime >= DateTime.Now.AddDays(-3)
where searches.Any(c => content.Contains(c))
select fi;

foreach (var file in files)
{
Console.WriteLine(file.FullName);
}
}

关于c# - 为同一行文本 C# 读取不同子文件夹中的特定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51950688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com