如何根据现有文件名创建文件名


private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
if (DrawingRects.Count > 0)
{
// The last drawn shape
var dr = DrawingRects.Last();
if (dr.Rect.Width > 0 && dr.Rect.Height > 0)
{
rectImage = cropAtRect((Bitmap)pictureBox2.Image, dr.Rect);
if (saveRectangles)
{
DirectoryInfo dInfo = new DirectoryInfo(@"d:rectangles");
var files = GetFilesByExtensions(dInfo, ".bmp");
if (files.Count() > 0)
{
foreach (var f in files)
{
}
}
rectangleName = @"d:Rectanglesrectangle" + saveRectanglesCounter + ".bmp";
FileList.Add($"{dr.Location}, {dr.Size}", rectangleName);
string json = JsonConvert.SerializeObject(
FileList,
Formatting.Indented // this for pretty print
);
using (StreamWriter sw = new StreamWriter(@"d:rectanglesrectangles.txt", false))
{
sw.Write(json);
sw.Close();
}
rectImage.Save(rectangleName);
saveRectanglesCounter++;
}
pixelsCounter = rect.Width * rect.Height;
pictureBox1.Invalidate();
listBox1.DataSource = FileList.ToList();
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
}
}

我使用的是DirectoryInfo和GetFilesByExtensions 方法

public IEnumerable<FileInfo> GetFilesByExtensions(DirectoryInfo dir, params string[] extensions)
{
if (extensions == null)
throw new ArgumentNullException("extensions");
IEnumerable<FileInfo> files = dir.EnumerateFiles();
return files.Where(f => extensions.Contains(f.Extension));
}

如果存在现有文件,例如rectangle1.bmp rectangle2.bmp……rectangle7.bmp然后当在硬盘上创建一个新的矩形文件时,我希望它是rectangle8.bmp

现在它正在尝试创建另一个rectangle1.bmp并给出异常,我不想删除现有的文件,而是创建新的文件。

并使其尽可能通用。但主要目标是根据现有文件名创建新的文件名,并继续计数。

您可以编写一个方法来检查提议的名称是否存在

string GetNextName(string baseName, string extension)
{
int counter = 1;
string nextName = baseName + counter + extension;
while(File.Exists(nextName))
{
counter++;
nextName = baseName + counter + extension;
}
return nextName;
}

并这样称呼它:

rectangleName = GetNextName(@"d:Rectanglesrectangle", ".bmp");

您可以使用linq并在一个语句中完成所有操作,如下所示:

DirectoryInfo di = new  DirectoryInfo(@"D:rectangles");
var maxIndex = di.GetFiles().Select(fi => fi.Name.Replace("rectangle","").Replace(".bmp", "")).Max(i => i);

最新更新