每次我单击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仍然存在。
因为你没有包含任何代码,我会给你一个无代码答案,指出你正确的方向
创建文件时,您需要列出目录中的所有文件,分隔数字,并对它们进行排序,以获取下一个可用数字,以了解要创建的文件名。
您可以通过枚举目录中的文件来获取列表
var fileList = Directory.EnumerateDirectories(dirPath);
然后你就会遇到一些简单的问题:拉开这些文件路径以获取名称,然后拆分名称以制作一个数字列表,然后找到你应该创建的数字
要从您可以使用的路径获取文件名,Path.GetFileNameWithoutExtension
要从文件名中获取数字,您可以使用RegEx
要将列表转换为int
列表,您可以使用Linq
你应该使用这样的东西,但是在你的本地路径中添加并且如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");
}
您可以使用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
具有类似于循环的唯一性,但它只需要一个单独的调用和一行代码,而不需要文件名预取。
这是一个程序,用于从文件列表中获取下一个连续的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
}
}
}