如何搜索文本文档中是否存在文件名?

How to Search if a File Name exists in a text document?

我正在用 C# 制作一个应用程序,我在其中搜索该文件是否存在于文本文件中。如果它不存在,它会将它添加到文本文件中,然后将其附加到列表中。但是,出于某种原因,该列表只包含一个文件并在该点结束。那么,有人可以帮我解决这个 foreach 循环中的问题吗?

static void CheckNewFile()
    {
        string path_f = @"File_Address_where_Text_file_exists";
        var new_file = new List<string>();
        if (!File.Exists(path_f))   # Checking if the text file exists or not and then creating it
        {
            var myFile = File.Create(path_f);
            myFile.Close();
        }
        DirectoryInfo hdDirectoryInWhichToSearch = new DirectoryInfo(@"File_Address_in_which_Files_need_to_be_searched");
        FileInfo[] filesInDir = hdDirectoryInWhichToSearch.GetFiles("AC" + "*" + "*.*" + "AC"); # Format of the file to be searched
        foreach (FileInfo foundFile in filesInDir) # foreach for the files in the directory
        {
            string fullName = foundFile.FullName;
            int flag = 0;
            var lines = File.ReadLines(path_f);

            foreach (var line in lines) # Reading line by line and checking if the file exists in the text file before
            {
                if (String.Equals(line, fullName))
                {
                    flag += 1;
                    break;
                }
            }

            if (flag < 1)
            {
                if (new FileInfo(path_f).Length == 0)    # File Address is appended in the File
                {
                    //TextWriter tw = new StreamWriter(path_f);
                    //tw.WriteLine(fullName);
                    //tw.Close();
                }
                else
                {
                    //using (var tw = new StreamWriter(path_f, true))
                    //{
                    //    tw.WriteLine(fullName);
                    //}
                }
                new_file.Add(fullName.ToString()); # Adding File Address to the list
                flag = 0;
                break;
            }
        }
    }

删除最后一个分隔符。它导致程序流离开包含文件名的封闭 foreach 循环。

正如另一位发帖人所提到的,您在 if 块的早期就打破了循环。

但是,实际上根本不需要标志(或循环或 if 块)。通过使用一点 System.Linq 并仅使用 Directory 通过将它们的路径与输入文件的内容进行比较来查找新文件,可以大大简化您的方法。

例如:

static List<string> CheckForNewFiles(string filePath, string searchDir, 
    string searchPattern)
{
    // Create file if it doesn't exist
    if (!File.Exists(filePath)) using (File.Create(filePath)) ;

    // Get list of files that match search pattern which aren't contained in our file
    var newFiles = Directory
        .GetFiles(searchDir, searchPattern)
        .Where(match => !File.ReadLines(filePath).Contains(match))
        .ToList();

    // Add the new file paths to our file
    File.AppendAllLines(filePath, newFiles);

    // Return the list of new files (?)
    return newFiles;
}

在使用中可能看起来像这样:

public static void Main()
{
    Console.WriteLine("Checking for new files...");

    var newFiles = CheckForNewFiles(@"c:\temp\paths.txt", @"c:\temp\temp", "*.png");

    Console.WriteLine($"{newFiles.Count} files found since last search.");

    if (newFiles.Any())
    {
        Console.WriteLine(" -> " + string.Join(Environment.NewLine + " -> ", newFiles));
    }

    Console.ReadLine();
}