1

C# winformExcelファイルに出力しているアプリケーションがあります。ファイル名の名前の形式が次のようになっているとしましょう。Output1.xlsl

ボタンのクリック/実行ごとに、出力を別のシーケンシャルファイルに保存したいと思います。だから次にそれはOutput2.xlslOutput3.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

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 に答える
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 に答える
0

それは最も効率的なものではないかもしれませんが、私は次の解決策を提案することができます

  1. ファイル名を「。」で分割します。
  2. サブストリング「出力」を削除します
  3. 次に、ソートして最大数を取得します。
于 2013-01-07T12:36:21.960 に答える
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 に答える