winforms 在C#的Windows窗体中创建附加文件时,如何使文件名按顺序无限长?

w8biq8rn  于 2022-11-17  发布在  C#
关注(0)|答案(4)|浏览(166)

每次我单击Windows窗体上的按钮时,我都想创建一个程序,无限地按顺序创建文件。
例如,这里有一个. txt文件。当我用c#的windows格式创建一个新名称的文件时,我想创建一个-2.txt。如果我继续添加更多的文件,我想创建一个-3.txt,一个-4.txt,一个-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仍然存在。

xkftehaa

xkftehaa1#

因为你还没有包括任何代码,我将给予你一个没有代码的答案,为你指出正确的方向
创建文件时,需要列出目录中的所有文件,分隔编号,并对它们进行排序,以找到下一个可用的编号,从而知道要创建的文件名。
您可以通过枚举目录中的文件来获取列表来实现此目的

var fileList = Directory.EnumerateDirectories(dirPath);

然后,您将面临一些简单的问题:拆开这些文件路径以获得名称,然后拆开名称以创建一个数字列表,然后找到下一个应该创建的数字
要从路径获取文件名,可以使用Path.GetFileNameWithoutExtension
要从文件名获取编号,可以使用RegEx
要将列表转换为int的列表,可以使用Linq

oknrviil

oknrviil2#

你应该使用这样的东西,但是添加你的本地路径,正如萨鲁曼所说,修剪掉返回的路径。
下面的代码应该检查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");
        }
hgc7kmma

hgc7kmma3#

您可以使用Windows API GetTempFileName指定:

  • 文件的位置
  • 前缀字符串
  • 它是否应该是唯一的

质量标准:

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

MSDN网站:
为临时文件创建名称。如果生成唯一的文件名,则创建一个空文件并释放其句柄。否则,仅生成文件名。
具体而言:
uUnique [in]用于创建临时文件名的无符号整数。有关详细信息,请参阅“备注”。
如果uUnique为零,函数将尝试使用当前系统时间生成一个唯一的文件名。如果文件已经存在,则数字加1,并且函数将测试该文件是否已经存在。此操作将一直持续到找到唯一的文件名;该函数创建一个文件名并关闭它。2注意当uUnique不为零时,该函数不试图验证文件名的唯一性。

为什么要使用此功能?

这里的其他答案,虽然很好,涉及到你获得所有预先存在的文件(其中可能有很多),然后计算文件名,然后在创建它之前测试唯一性,到那时,具有相同名称的文件可能会被另一个进程创建。虽然GetTempFileName有一个类似唯一性的循环,它只需要你一个单独的调用和一行代码,并且不需要文件名预取。
更多

u1ehiz5o

u1ehiz5o4#

下面是一个程序,从文件列表中获取下一个连续的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
      }
   }
}

相关问题