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

问题描述 投票:0回答:6

我创建了一个屏幕截图程序,一切运行良好。 唯一的问题是,我不知道如何才能做到这一点,以便屏幕截图以附加数字的形式保存。

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

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

c# .net sequence filenames
6个回答
13
投票

这是我在这种情况下经常使用的方法。只需传递一个像“Screenshot”这样的字符串,它就会找到格式为“Screenshot [number]”的最低可用文件名(如果还没有,则只是“Screenshot”):

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;
}

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


3
投票

您使用数字有什么原因吗?同一文件夹稍后会在另一个会话中重复使用吗?如果日期不同,数字是否应该重新启动并替换现有文件?

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

正如其他建议中所发布的,您仍然需要检查文件是否已经存在,并且当您重试 DateTime.Now 时会有所不同,因此文件名会有所不同。当然,除非屏幕截图处于同一毫秒内或者用户弄乱了日期/时间(或者夏令时也会弄乱您),否则您不应该遇到任何冲突。


3
投票

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

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

您应该始终使用

Path.Combine
函数,而不是进行基于字符串的连接,以避免托管服务器上出现错误。您永远不知道网站将如何托管 - 子域、根网站等。


0
投票

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

为此,您可以使用

DirectoryInfo
类和
Regex
类。


0
投票

解决方案总结

  1. Directory.GetFiles(dest);
  2. 对文件名进行排序
  3. 分析最后一个文件名,找到您最后使用的号码
  4. 写入下一个文件并附加下一个数字。

这对你有用吗?


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");

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.