c#顺序文件输出

本文关键字:输出 顺序文件 | 更新日期: 2023-09-27 17:50:50

我有一个输出到excel文件的C# winform应用程序。假设文件名的名称格式为:Output1.xlsl

我希望在每个按钮单击/执行时将输出保存到另一个顺序文件。接下来是Output2.xlsl, Output3.xlsl…等。

如何检查,我知道检查文件是否存在,但如何检查编号?

FileInfo newExcelFile = new FileInfo(@"Output1.xlsx");
if (newExcelFile.Exists)
{
      ...
}

c#顺序文件输出

你可以使用File.ExistsPath.Combine:

string directory = @"C:'SomeDirectory";
string fileName = @"Output{0}.xlsx";
int num = 1;
while (File.Exists(Path.Combine(directory, string.Format(fileName, num))))
    num++;
var newExcelFile = new FileInfo(Path.Combine(directory, string.Format(fileName, num)));

一般来说,静态File方法比总是创建FileInfo实例更有效。

我们使用类似的方法来实现这一点:

/// <param name="strNewPath">ex: c:'</param>
/// <param name="strFileName">ex: Output.xlsx</param>
/// <returns>Next available filename, ex: Output3.xlsx</returns>
public static string GetValidFileName(string strNewPath, string strFileName)
{
    var strFileNameNoExt = Path.GetFileNameWithoutExtension(strFileName);
    var strExtension = Path.GetExtension(strFileName);
    var intCount = 1; 
    while (File.Exists(Path.Combine(strNewPath, strFileNameNoExt + intCount + strExtension)))
        intCount++;
    return Path.Combine(strNewPath, strFileNameNoExt + intCount + strExtension);
}

用while循环把它括起来

int num = 1;
FileInfo newExcelFile = new FileInfo("Output1.xlsx");
while(newExcelFile.Exists)
{
    newExcelFile = new FileInfo("Output" + num + ".xlsx");
    num++;
}

我会在文件夹中找到最新的文件,并使用它的编号作为开始的基础。如果没有其他程序要写,这应该足够了。

DirectoryInfo di = new DirectoryInfo("Some folder");
            FileInfo fi = di.GetFiles().OrderByDescending(s => s.CreationTime).First();
            string fileName = fi.Name;

//…

你可以做一个简单的循环:

FileInfo newExcelFile = null;
for (int i = 0; i < int.MaxValue; i++)
{
    newExcelFile = new FileInfo(string.Format(@"Output{0}.xlsx", i));
    if (!newExcelFile.Exists)
    {
        break;
    }
    newExcelFile = null;
}
if (newExcelFile == null)
{
    // do you want to try 2147483647
    // or show an error message
    // or throw an exception?
}
else
{
    // save your file
}

这可能不是最有效的方法,但我可以建议以下解决方案

  1. 将文件名分割为"。"
  2. 删除子字符串"Output"
  3. 现在排序得到最大的数目。

这取决于逻辑。如果您有Output1.xlsx Output2.xlsx Output3.xlsx并删除Output2.xlsx,应该发生什么,新文件是Output2.xlsx还是Output4.xlsx ?如果您希望新文件的数目总是最大的,可以使用类似的代码

        int lastNum = 0;
        string[] files = Directory.GetFiles("c:''myDir", "Output*.xlsx");
        if (files.Length > 0)
        {
            Array.Sort(files);
            lastNum = Convert.ToInt32(Regex.Match(files[files.Length - 1], "Output[''d](*).xlsx").Result("$1"));
            lastNum++;
        }
        FileInfo newExcelFile = new FileInfo("Output" + lastNum + ".xlsx");

当然可以循环,但如果有数千个文件,这不是一个好主意。对于少量的文件,

就可以了
        int i = 0;
        for (; i < Int32.MaxValue; i++)
        {
            if (File.Exists("Output" + i + ".xlsx"))
                break;
        }