我有一个包含.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
}}
知道如何实现这个目标吗?
答案 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);
}