C#顺序文件输出

时间:2013-01-07 12:31:37

标签: c# .net winforms

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

我想在每次按钮点击/执行时将输出保存到另一个顺序文件。 接下来它将是Output2.xlslOutput3.xlsl ......等等。

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

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

7 个答案:

答案 0 :(得分:3)

您可以使用此循环,将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实例更有效。

答案 1 :(得分: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);
}

答案 2 :(得分:1)

将其包裹在while循环中

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

答案 3 :(得分:1)

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

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

// ...

答案 4 :(得分: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
}

答案 5 :(得分:0)

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

  1. 将文件名拆分为&#34;。&#34;
  2. 删除子字符串&#34;输出&#34;来自它
  3. 现在排序以获得最大数量。

答案 6 :(得分: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;
        }