7

我创建了一个截图程序,一切都很好。唯一的问题是,我不确定如何制作它,因此屏幕截图与附加数字一起保存。

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

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

4

6 回答 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;
}

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

于 2009-10-08T00:55:05.017 回答
3

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

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

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

于 2009-10-08T01:10:44.600 回答
2

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

public 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函数,而不是进行基于字符串的连接,以避免托管服务器上的错误。您永远不知道网站将如何托管 - 子域、根站点等。

于 2013-07-17T17:57:50.913 回答
0

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

为此,您可以使用DirectoryInfo该类和Regex该类。

于 2009-10-08T00:52:27.530 回答
0

解决方案总结

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

这对你有用吗?

于 2009-10-08T00:52:40.120 回答
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");

于 2010-09-15T20:48:55.110 回答