while循环仍在运行,即使超出了限制

时间:2018-07-27 23:23:31

标签: c# windows while-loop

我正在用C#编写自定义Windows安装程序,但是有问题。 基本上,在应用程序加载时,它应在所有磁盘根目录的“ sources”文件夹中搜索一个名为“ Install.Wim”的文件,并显示一个消息框,其中包含找到的第一个文件的完整路径。 我设法做到这一点,它里面放置了一个foreach语句的while循环。 While的代码是:

int filenofound = 0;
string wimpath = "sources\\install.wim"
DriveInfo[] allDrives = DriveInfo.GetDrives();

while (filenofound < 1)
{
    foreach (DriveInfo d in allDrives)
    {
        if (File.Exists(d + wimpath))
        {
        wimDsk = d + wimpath;
        MessageBox.Show("Install.WIM found at " + wimDsk);
        filenofound = 1;
        MessageBox.Show("Filefound value: " + filenofound);
        }
    }
}

但是由于某种原因,该程序为找到的每个文件显示一个消息框,跳过了While限制。 我试过使用“ filenofound”变量作为布尔值,同样的问题;当变量为true时,while仍然继续执行。 抱歉,如果这是一个基本问题,那么我是这种语言的菜鸟。

2 个答案:

答案 0 :(得分:3)

我根本看不到需要while语句,如果您的目标是在所有目录中搜索指定的文件并在第一个目录处停止,为什么还需要再次循环?

这应该搜索并找到文件并停止:

    //bool bFileFound = false;
    string wimpath = "sources\\install.wim";
    DriveInfo[] allDrives = DriveInfo.GetDrives();
    //while (!bFileFound)
    //{
        foreach (DriveInfo d in allDrives)
        {
            if (File.Exists(d + wimpath))
            {
                wimDsk = d + wimpath;
                MessageBox.Show("Install.WIM found at " + wimDsk);
                // bFileFound = true; not needed with break;
                break; // break forces the current loop to exit
            }
        }
    //} 

如果您需要文件中的do while循环,那么我可能会使用以下代码:

    bool bFileFound = false;
    int iLoopCount = 0; //remove loop count if you need to keep looking forever.
    string wimpath = "sources\\install.wim";
    DriveInfo[] allDrives = DriveInfo.GetDrives();
    do
    {
        foreach (DriveInfo d in allDrives)
        {
            if (File.Exists(d + wimpath))
            {
                wimDsk = d + wimpath;
                MessageBox.Show("Install.WIM found at " + wimDsk);
                bFileFound = true;
                break;
            }
        }
        iLoopCount++;
        if (!bFileFound)
        {
            System.Threading.Thread.Sleep(100);
        }
    } while (!bFileFound && iLoopCount < 100000);

答案 1 :(得分:1)

获得所需内容的另一种方法是使用一点System.Linq首先获得要搜索的路径列表(每个驱动器一个),然后返回第一个用于其中File.Exists返回true

我们可以使用FirstOrDefault方法,该方法将返回找到的第一个方法;如果没有找到,则返回null,然后我们可以测试null的返回值以显示消息:

string wimPath = "sources\\install.wim";

// Select the combined path for each drive then return the first one found (or null)
string fullPath = DriveInfo.GetDrives()
    .Select(drive => Path.Combine(drive.ToString(), wimPath))
    .FirstOrDefault(File.Exists);                      

if (fullPath == null)
{
    MessageBox.Show("Install.WIM not found on any drive");
}
else
{
    MessageBox.Show("Install.WIM found at: " + firstPath);
}

注意:要使用Linq扩展方法(SelectFirstOrDefault),您需要在文件顶部使用以下using语句:

using System.Linq;