C# 使用字符串生成器查找richtextbox中缺少的项

C# 使用字符串生成器查找richtextbox中缺少的项,c#,winforms,C#,Winforms,嗨,伙计们,我正在用某种匹配系统寻找丢失的物品。我的想法是根据需要填充richtextbox和格式 但我想转到一个目录,查找richtextbox中的项目,但不在目录c:\s\slimyyyy中,到目前为止,我使用字符串生成器,它只在列表中的第一项不在目录中时有效,但如果第二项或第三项等不在目录中,它将不会收到错误消息。有什么想法吗?到目前为止,这是我的代码,仅当richtextbox中的项目列表中的第一项确定时才有效。我希望能够单击按钮事件处理程序缺少不在上述目录中的项目,请在下面查找我的代码

嗨,伙计们,我正在用某种匹配系统寻找丢失的物品。我的想法是根据需要填充richtextbox和格式 但我想转到一个目录,查找richtextbox中的项目,但不在目录c:\s\slimyyyy中,到目前为止,我使用字符串生成器,它只在列表中的第一项不在目录中时有效,但如果第二项或第三项等不在目录中,它将不会收到错误消息。有什么想法吗?到目前为止,这是我的代码,仅当richtextbox中的项目列表中的第一项确定时才有效。我希望能够单击按钮事件处理程序缺少不在上述目录中的项目,请在下面查找我的代码。到目前为止,我做错了什么?提前感谢您的指导

public void OutputErrorMessage(string messages)
{
    MessageBox.Show(messages, "You are missing files");
}

private void button4_Click(object sender, EventArgs e)
{
    string str = rchTxtContent.Text;
    var printList = new List<string>();
    string dir = @"C:\slim\slimyyyy";

    if (Directory.Exists(dir))
    {
        string[] pdf_specFiles = Directory.GetFiles(dir);
        if (pdf_specFiles.Length > 0)
        {
            // Declare  and instantiate new string builder
            StringBuilder builder = new StringBuilder();
            // The flag
            bool itemFound = false;

            // foreach (object item in listBox1.Items)
            foreach (object line in rchTxtContent.Lines)
            {
                foreach (string file in pdf_specFiles)
                {
                    string fileName = Path.GetFileName(file);
                    if (fileName == line.ToString())
                    {
                        itemFound = true;
                        printList.Add(Path.GetFullPath(file));
                    }
                }

                // Add the item to the list of missing items.
                if (!itemFound )
                {
                    // Append to the builder
                    // if (builder.Length == 0)
                    {
                        builder.AppendLine("[Missing Files]");
                    }
                    builder.AppendLine(line.ToString());
                }

如果您只是想了解RichTextBox中的文件名与目录中的文件名之间的差异,我认为您可以用一种更短的方式来完成:

string directoryPath = @"C:\slim\slimyyyy";
if (!Directory.Exists(directoryPath))
    return; // error message or exception

List<string> filesInRichTextBox = richTextBox1.Lines.ToList();
List<string> filesInDirectory = Directory.GetFiles(directoryPath).Select(file => new FileInfo(file).Name).ToList(); // get all files (as strings) and just the filename of it (without the whole path)

List<string> result = filesInRichTextBox.Except(filesInDirectory).ToList(); // give me all the files in the RichTextBox that are not in the directory
string missingFiles = string.Format("Missing Files: {0}", string.Join(", ", result)); // which will be something like "Missing Files: abc.txt, def.txt, etc...

希望这有帮助

首先,如果保持方法简单,您会发现代码更易于编写和维护。理想情况下,单一方法应该只做一件事。在您的示例中,有一个方法可以执行以下几项操作:

从目录中获取文件 从文本框中获取名称列表 比较列表,生成一个新列表 这似乎是你最需要帮助的最后一部分,所以让我们集中精力。您试图做的事情归结起来就是从文本框中的一个字符串列表开始,并从目录中排除另一个字符串列表(文件名)中的所有成员。这在.NET中非常容易做到:

List<string> GetMissingFiles(
    IEnumerable<string> desiredFiles, IEnumerable<string> actualFiles)
{
    return desiredFiles.Except(
        actualFiles.Select(file => Path.GetFileName(file))).ToList();
}
在该示例中,它总是将目录中的文件列表从所需的文件列表中排除。如果缺少目录,则使用空枚举,就像目录存在但为空一样。这样,生成的printList对象将包含所有原始文件

最后,我将注意到Windows文件系统都不区分大小写。仅当字符串完全相同(包括大小写)时,上述内容才会匹配。相反,您可能更喜欢与文件系统使用的内容类似的不区分大小写的比较。在这种情况下,只需将相等比较器传递给Except方法:

编辑:

因此,在我看来,查看您的注释并进一步查看您的原始代码,您可以通过移动一行代码来实现您的目的:bool itemFound=false

现在,这行代码在rchTxtContent.Lines循环中的foreach对象行之外,这意味着在找到第一个项之后,itemFound标志永远不会重置为false

如果您将这行代码移动到rchTxtContent.Lines循环中的foreach对象行中,即在开始处,我认为您将得到您想要的


你发布的代码确实需要其他改进,我想你应该遵循我上面提供的建议。但是,如果您所关心的只是获取某些特定的输出,那么只需移动该变量的声明和初始化就可以了。

查看列表类型字典,它就像一个列表,但单词可以是索引,该值可以是该单词的计数,例如谢谢Thomas现在检查它,它还有一个函数containsKey,那么你可以检查关键字/单词是否存在谢谢,我所做的就是查找丢失的文件,因为在我将它们发送到后台打印程序打印文件时,如果某个文件缺少keet选项卡,或者我可以在打印之前先这样做,我只想确定哪些文件在richtetxbox中,但不在目录中。谢谢Peter,我想查找richtextbox中已经存在的文件,但检查是否存在于所说的c:\slim\slimyyyy目录中我不确定我是否理解您的评论,但如果我理解了,这正是我的回答所提供的:它将计算printList作为字符串列表,这些字符串是文本框中的文件名,但在目录中找不到就像打印作业完成后我用来显示所有缺失项目的head一样。理想情况下,RictXbox中的项目的顺序是==>ABC.pdf、DEF.pdf、GHI.pdf,现在如果ABC.pdf不在那里,我想马上收到一条消息,我的代码会这样做,但只有当第一个项目ABC.pdf是缺失文件或缺失文件之一时,代码才会起作用,谢尔顿:对不起,我不太明白你的意思。现在是什么意思?我的答案中的代码示例将为您提供所有缺失文件的完整列表。为什么你想要一条消息说ABC.pdf不见了,除非它真的不见了。也就是说,你说只有当文件丢失时才有效,但是当ABC.pdf不丢失时它会做什么,这与你想要的有什么不同?你有没有试着用我的建议来修改你的代码?对不起@Danilo我的英语很差,我只是想说我的程序可以正常工作,但不正常,先生。
string dir = @"C:\slim\slimyyyy";

if (Directory.Exists(dir))
{
    string[] pdf_specFiles = Directory.GetFiles(dir);
    if (pdf_specFiles.Length > 0)
    {
        List<string> printList = GetMissingFiles(rchTextContent.Lines, pdf_specFiles);

        // do something with printList
    }
}
string dir = @"C:\slim\slimyyyy";
IEnumerable<string> pdf_specFiles = Directory.Exists(dir) ?
    Directory.GetFiles(dir) : Enumerable.Empty<string>();

List<string> printList = GetMissingFiles(rchTextContent.Lines, pdf_specFiles);

// do something with printList
List<string> GetMissingFiles(
    IEnumerable<string> desiredFiles, IEnumerable<string> actualFiles)
{
    return desiredFiles.Except(
        actualFiles.Select(file => Path.GetFileName(file)),
        StringComparer.OrdinalIgnoreCase).ToList();
}
string missingFilesText = "[Missing Files]" + Environment.NewLine +
    string.Join(Environment.NewLine, printList);