在以C#的Windows形式创建其他文件时,如何使文件名顺序无限?

问题描述 投票:-3回答:4

每次我单击Windows窗体上的按钮时,我都想创建一个无限顺序创建文件的程序。

例如,这是一个a.txt文件。当我在c#的windows形式中将其创建为具有新名称的文件时,我想创建一个-2.txt。如果我不断添加更多文件,我想无限制地创建a-3.txt,a-4.txt,a-5.txt ....

例如,这是文件。 a-2.txt,a-3.txt,a-4.txt,a-5.txt如果我随机删除a-3.txt,a-4.txt,我想知道如何制作a-3.txt, a-4.txt,a-6.txt,a-7.txt ....每次单击Windows窗体上的按钮。原因是a-2.txt,a-5.txt仍然存在。

c# winforms filenames
4个回答
1
投票

因为你没有包含任何代码,我会给你一个无代码答案,指出你正确的方向

创建文件时,您需要列出目录中的所有文件,分隔数字,并对它们进行排序,以获取下一个可用数字,以了解要创建的文件名。

您可以通过枚举目录中的文件来获取列表

var fileList = Directory.EnumerateDirectories(dirPath);

然后你就会遇到一些简单的问题:拉开这些文件路径以获取名称,然后拆分名称以制作一个数字列表,然后找到你应该创建的数字

要从您可以使用的路径获取文件名,Path.GetFileNameWithoutExtension

要从文件名中获取数字,您可以使用RegEx

要将列表转换为int列表,您可以使用Linq


0
投票

你应该使用这样的东西,但是在你的本地路径中添加并且如Saruman所述,修剪返回的路径。

下面的代码应该检查a.txt并调用另一个函数来创建它(如果它不存在)。如果确实存在a.txt,它会查找具有适当名称的所有文件,并将它们分为“ - ”和“。”。只取出数字,将数字转换成一个列表并对其进行排序。

计数器查找列表中的第一个间隙,如果找到一个,则使用它,否则选择适当的1个更高的数字。这只是潦草的,没有经过测试(VS目前不想工作)所以你可能需要调试。

        if (System.IO.File.Exists("a.txt"))
        {
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("^a-\\d+\\.txt$");
            int[] numbers = System.IO.Directory.GetFiles("path", "a-*.txt").Where(x => regex.IsMatch(x)).Select(x => int.Parse(x.Split('-', '.')[1])).OrderBy(x => x).ToArray();
            for (int c = 0; c < numbers.Length; c++)
                if (numbers[c] != c + 2)
                {
                    CreateFile(string.Concat("a-", (c + 2).ToString(), ".txt"));
                    break;
                }
            CreateFile(string.Concat("a-", (numbers.Length + 2).ToString(), ".txt"));
        }
        else
        {
            CreateFile("a.txt");
        }

0
投票

您可以使用Windows API GetTempFileName指定:

  • 你想要的文件
  • 前缀字符串
  • 它是否应该是唯一的

规格:

UINT WINAPI GetTempFileName(
  _In_  LPCTSTR lpPathName,
  _In_  LPCTSTR lpPrefixString,
  _In_  UINT    uUnique,
  _Out_ LPTSTR  lpTempFileName
);

MSDN:

为临时文件创建名称。如果生成了唯一的文件名,则会创建一个空文件并释放其句柄;否则,仅生成文件名。

特别:

uUnique [in]用于创建临时文件名的无符号整数。有关更多信息,请参阅备注。

如果uUnique为零,则该函数尝试使用当前系统时间形成唯一文件名。如果该文件已存在,则该数字将增加1,并且函数将测试此文件是否已存在。这将继续,直到找到唯一的文件名;该函数按该名称创建一个文件并关闭它。请注意,当uUnique为非零时,该函数不会尝试验证文件名的唯一性。

为什么用这个?

这里的另一个答案,虽然很好,但涉及到你获得所有预先存在的文件(其中可能有很多),然后计算文件名,然后在创建之前测试唯一性,这时另一个文件可以由另一个创建处理。虽然GetTempFileName具有类似于循环的唯一性,但它只需要一个单独的调用和一行代码,而不需要文件名预取。

更多


0
投票

这是一个程序,用于从文件列表中获取下一个连续的id,然后写入具有该id的新文件

注意:我很无聊这样做,我认为这可以为您提供进一步了解所需的所有信息

class Program
{

   private static int GetNextId(List<int> ids)
   {
      int i;
      for (i = 0; ids[i] == i; i++); // search for first missing id
      return i;
   }

   static void Main(string[] args)
   {
      var myPath = @"d:\test"; // your path

      var fileNames = Directory.EnumerateFiles(myPath) // get files in your path
         .Select(Path.GetFileNameWithoutExtension)     // get the file name from the full path
         .ToList(); // convert it to list

      var ids = fileNames.Select(fileName => 
      Convert.ToInt32(fileName.Substring(fileName.IndexOf("-") + 1))) // get the index of dash, then get the rest of the name (id)
         .ToList(); // convert it to a list of int

      ids.Sort(); // sort it to make sure its in order

      var nextFileId = GetNextId(ids); // get the consecutive id 

      // write a new file
      using (var file = File.Create(Path.Combine(myPath, $"myFile-{nextFileId}")))
      {
         // file.write(); write stuff here
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.