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

C# 为同一行文本读取不同子文件夹中的特定文件#,c#,C#,我目前正在创建一个短控制台应用程序来读取多个子文件夹中的特定文件。该文件在所有目录中都具有相同的名称,因此将它们全部移动到一个目录并重命名它们将是一个巨大的麻烦(这些文件中有超过365个。它们每天都会自动创建一个新名称,可以追溯到几年前)。但是,它们都在同一个主文件夹下 我已经调查过了。我知道我能够搜索每个单独的子文件夹并查看所有文件(我能够为在我的foreach语句中找到的每个文件将其fileName显示到控制台) 迄今为止的代码: static void Main(string[] args

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

我已经调查过了。我知道我能够搜索每个单独的子文件夹并查看所有文件(我能够为在我的
foreach
语句中找到的每个文件将其
fileName
显示到控制台)

迄今为止的代码:

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; }
}
static void Main(字符串[]args)
{
string readLine=string.Empty;
var dir=newdirectoryinfo(@“C:\MotherDir\”);
//foreach循环遍历每个子文件夹以查找fileined.txt
foreach(dir.EnumerateFiles(“FileINeed.txt”,SearchOption.AllDirectories)中的var文件)
{
//我在这里遇到一个错误:“System.IO.FileNotFoundException:'无法归档文件-'”
正在使用(StreamReader sr=new StreamReader(file.ToString())//这使用了错误的目录,而不是以前设置的目录(var dir)
{
而(!sr.EndOfStream)
{
readLine=sr.readLine();
ProcessFiles(file.ToString());
}
}
}
控制台。WriteLine(“完成”);
Console.ReadKey();//在程序结束时获取暂停
}
//方法传递文件以搜索特定字符串
静态文件条目ProcessFiles(字符串文件名)
{
fileEntry inputFiles=新建fileEntry();
string fileString=string.Empty;
字符串读取线;
使用(StreamReader sr=新StreamReader(文件名))
{
而(!sr.EndOfStream)
{
readLine=sr.readLine();
如果(readLine.Length<1)
{
}
if(readLine.Contains(“运行日期:”)
{
控制台。写入(“运行日期:”;
控制台写入线(读线);
}
if(readLine.Contains(“1234567”))
{
Console.Write(“找到这个:”);
控制台写入线(读线);
}
if(readLine.Contains(“7654321”))
{
Console.Write(“找到这个:”);
控制台写入线(读线);
}
if(readLine.Contains(“1346785”))
{
Console.Write(“找到这个:”);
控制台写入线(读线);
}
if(readLine.Contains(“2589632”))
{
Console.Write(“找到这个:”);
控制台写入线(读线);
}
if(readLine.Contains(“12587412”))
{
Console.Write(“找到这个:”);
控制台写入线(读线);
}
}
}
inputFiles.FileName=fileString;
返回输入文件;
}
公共类文件项
{
//存储文件名和日期时间
公共字符串文件名{get;set;}
公共日期时间文件日期{get;set;}
}
我为糟糕的
if
语句寻找特定字符串表示歉意,我试图使用switch/case语句,但无法使其工作

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

我对C#还是相当陌生的,这是我第一个从零开始编写的有价值的程序之一。因此,我为我仍在学习的糟糕的编码实践(如果有)道歉!如果您有任何建议或帮助,将不胜感激!如果我需要澄清任何事情,请告诉我


提前感谢!EnumerateFiles返回一个
FileInfo
对象。使用文件。
FullName
属性获取完全限定的路径名。

如果不必要使用StreamReader,只需将其传递给ProcessFiles(而不是file.ToString())但是file.FullName是文件的全名和路径-另一个是FileInfo对象):

注意:ProcessFiles的用途很难理解。例如:为什么在作为新类处理时返回文件?在第一次获取列表的位置已经有了这些文件

注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);
    }           
}

错误的是,您正在打开每个文件并将文件内容传递给
ProcessFiles
,这实际上需要一个文件名,而不是文件内容。请尝试将
main()
方法更改为此

static void Main(string[] args)
{
    // this gets all matching files in a string array...
    string[] allfiles = Directory.GetFiles(@"C:\MotherDir\", "FileINeed.txt", SearchOption.AllDirectories);

    // parse the string array and call ProcessFiles for each one...
    foreach (var file in allfiles)
    {
        ProcessFiles(file);
    }

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

我想这是你用的

file.ToString()
我不确定它会返回什么。要从FileInfo获取流,您需要使用

file.OpenText()
因此,您失败的代码将被删除

using (StreamReader sr = file.OpenText())
您的ProcessFiles可以采用FileInfo而不是字符串,这样您就得到了

static fileEntry ProcessFiles(FileInfo file)
如果要从FileInfo获取文件的完整路径,可以使用

Path.Combine(file.DirectoryName, file.Name)

@Archer,请查看代码中的注释。我当前在使用(StreamReader sr=new StreamReader(file.ToString())时遇到了一个错误。到目前为止,我的文件没有被处理。是的,谢谢-我看到了,并删除了我的注释。如果你在代码之外解释问题是什么,可能会更好,但至少它是存在的:)这太棒了!谢谢!我不知道
FullName
是一个属性。-ProcessFiles是为一个完全不同的更高级的程序编写的。我只是拿走了它,去掉了它,只保留了我认为需要的东西。我在方法的创建中加入了类
fileEntry
Path.Combine(file.DirectoryName, file.Name)