1

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

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

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

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

7 回答 7

3

您可以使用此循环并File.Exists使用Path.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实例更有效。

于 2013-01-07T12:37:22.883 回答
2

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

/// <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);
}
于 2013-01-07T12:38:54.457 回答
1

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

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

//....

于 2013-01-07T12:37:45.890 回答
1

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

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
}
于 2013-01-07T12:38:01.787 回答
1

只需将其包装在一个while循环中

int num = 1;
FileInfo newExcelFile = new FileInfo("Output1.xlsx");
while(newExcelFile.Exists)
{
    newExcelFile = new FileInfo("Output" + num + ".xlsx");
    num++;
}
于 2013-01-07T12:36:02.597 回答
0

这取决于逻辑。如果你已经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;
        }
于 2013-01-07T12:57:12.127 回答
0

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

  1. 用“.”分割文件名
  2. 从中删除子字符串“输出”
  3. 现在排序以获得最大数量。
于 2013-01-07T12:36:21.960 回答