C#:读取文件夹中的下一个文件?

时间:2016-08-14 10:43:28

标签: c# .net

我有一个包含.txt个文件的文件夹,编号如下:

0.txt
1.txt
...
867.txt
...

我想要做的是每次调用readNextFile();时,我希望它返回该文件夹中下一个文件的内容,如果最后一个文件后面没有文件则返回return string.Empty;它看了。 我想要一个按钮,当按下该按钮时,将使程序读取下一个文件并对其内容进行处理。按下按钮之间的文件可能会发生变化。之前我这样做的方式是:

int lastFileNumber = 0;

string readNextFile()
{
    string result = string.Empty;
    //I know it is recommended to use as few of these as possible, this is just an example.
    try
    {
        string file = Path.Combine("C:\Somewhere", lastFileNumber.ToString() + ".txt");
        if (File.Exists(file))
        {
            result = File.ReadAllText(file);
            lastFileNumber++;
        }
    }
    catch
    {

    }
    return result;
}

问题是有时会出现这种情况:

0.txt
1.txt
5.txt
6.txt
...

显然会卡在1.txt,因为2.txt不存在。我需要它跳到下一个现有文件并阅读那个文件。很明显,不可能只是按字母顺序对文件名进行排序,因为文件名不是Padded,所以这样做会导致在{{1}后立即读取1000000000.txt }}

知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

您可以使用linq根据存储的号码检查下一个文件。这是在通过将文件名称转换为整数表示来对文件进行排序后完成的:

int lastFileNumber = -1;
bool isFirst = true;
private void buttonNext_Click(object sender, EventArgs e)
{
    int lastFileNumberLocal = isFirst ? -1 : lastFileNumber;
    isFirst = false;
    int dummy;
    var currentFile = Directory.GetFiles(@"D:\", "*.txt", SearchOption.TopDirectoryOnly)
                            .Select(x => new { Path = x, NameOnly = Path.GetFileNameWithoutExtension(x) })
                            .Where(x => Int32.TryParse(x.NameOnly, out dummy))
                            .OrderBy(x => Int32.Parse(x.NameOnly))
                            .Where(x => Int32.Parse(x.NameOnly) > lastFileNumberLocal)
                            .FirstOrDefault();

    if (currentFile != null)
    {
        lastFileNumber = Int32.Parse(currentFile.NameOnly);

        string currentFileContent = File.ReadAllText(currentFile.Path);
    }
    else
    {
       // reached the end, do something or show message
    }
}

答案 1 :(得分:1)

我认为如果不首先获取整个文件列表,您就无法找到最后的文件。通过按文件名长度排序,然后按文件名排序,可以简化排序。

if (paymentSuccessful) {
  fab.setVisibility(View.VISIBLE);
} else {
  fab.setVisibility(View.GONE);
}