C# - 将数字附加到要保存的文件

时间:2009-10-08 00:48:16

标签: c# .net sequence filenames

我创建了一个截图程序,一切都很好。唯一的问题是,我不知道如何制作它,所以屏幕截图会附加数字保存。

示例:屏幕截图1,屏幕截图2,屏幕截图3,屏幕截图4等

显然,这可以应用于正在保存的其他文件。有任何想法吗?谢谢。

6 个答案:

答案 0 :(得分:11)

这是我经常用于这种情况的方法。只需传入一个像“截图”这样的字符串,它会以“屏幕截图[数字]”的格式找到最低的可用文件名(如果还没有,则只显示“屏幕截图”):

private string GetUniqueName(string name, string folderPath)
{
    string validatedName = name;
    int tries = 1;
    while (File.Exists(folderPath + validatedName))
    {
        validatedName = string.Format("{0} [{1}]", name, tries++);
    }
    return validatedName;
}

(注意:这是一个略微简化的版本,不考虑文件扩展名。)

答案 1 :(得分:3)

你有使用数字的原因吗?稍后会为同一个文件夹重新使用同一个文件夹吗?如果日期不同,数字是否应重新启动并替换现有文件?

这些是要记住的事情。值得注意的是,操作系统X在进行屏幕截图时曾经提供“图片1”,“图片2”,幸好在新版本中,它现在使用“2009-12-08 at 11.35.12截取的屏幕截图”或类似内容,允许更容易按日期排序,轻松避免命名冲突等。

正如其他建议中所述,您仍然需要检查文件是否已存在,以及何时重试DateTime.Now将不同,因此文件名将不同。当然你不应该有任何冲突,除非截图是在相同的毫秒内或者用户正在弄乱日期/时间(或者夏令时也会让你感到困惑)。

答案 2 :(得分:2)

这是Rex M最初提出的一个改进的解决方案。它将生成文件名,如实际问题中所述:

public string GetUniqueName(string name, string folderPath)
{
    string pathAndFileName = Path.Combine(folderPath, name);
    string validatedName = name;
    int count = 1;
    while(File.Exists(Path.Combine(folderPath, validatedName)))
    {
        validatedName = string.Format("{0}{1}{2}",
            Path.GetFileNameWithoutExtension(pathAndFileName),
            count++,
            Path.GetExtension(pathAndFileName));
    }
    return validatedName;
}

答案 3 :(得分:0)

由于您正在编写文件,因此一种方法是搜索当前的保存目录并找到名为ScreenshotXX的最新文件,并使用正则表达式从名称中获取数字。

您可以将DirectoryInfo类与Regex类一起使用。

答案 4 :(得分:0)

解决方案摘要

  1. Directory.GetFiles(目标);
  2. 对文件名称进行排序
  3. 分析上一个文件名,找到您使用的最后一个号码
  4. 写下一个附加了下一个数字的文件。
  5. 这对你有用吗?

答案 5 :(得分:0)

这就是我使用的:

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string newPath; List<string> files = new List<string>(Directory.GetFiles(path,"*.txt",SearchOption.TopDirectoryOnly)); for(int i=0; files.Contains(newPath=string.Format(path + @"\textfile{0}.txt",i)); i++) { Console.WriteLine("File:{0} exist skipping....", newPath); } File.WriteAllText(newPath,"dummy");