【问题标题】:How do I create a random image name in C#?如何在 C# 中创建随机图像名称?
【发布时间】:2011-02-18 12:14:21
【问题描述】:

当我添加图片时,我希望它创建一个新的随机文件名,因为如果添加同名图片,它只会覆盖。

【问题讨论】:

  • 您应该更加努力地构建您的问题。向我们展示一些代码或描述您正在做什么。
  • 显然你不一定想要一个 »random« 而是一个 »unique« 文件名。这两者可能非常不同。
  • 独特也是一个机会,但我该怎么做呢?

标签: c# random filenames


【解决方案1】:

也许您正在寻找GetTempFileName

【讨论】:

  • 这会在 $Env:TEMP 中创建一个文件并将其名称传递给您。如果 OP 不想要该文件,或者想要另一个不正确的扩展名。
  • @Johannes Rössel - 我知道确实如此,但问题很模糊,我不知道他真正想要什么。
  • 图片文件通常不以.tmp 结尾或驻留在$Env:TEMP 中。我会应用常识和一些启发式方法;-)
【解决方案2】:

您可以生成一个 Guid 并将其用作您的文件名。虽然这意味着这些文件不是人类可读的,并且没有关于内容是什么的信息。

【讨论】:

    【解决方案3】:

    您可以使用当前时间构建它。

    string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
    

    上面的示例将使用年、月、日、小时、分钟、秒和秒的小数部分来格式化当前时间。 (如果您希望将秒数减少到一秒,则可以使用更少的fs 指定秒数。)。


    优点:

    • 它将在按字母顺序排列的列表中按创建时间自动排序。 (类似于 Windows 资源管理器中的默认排序。)
    • 它是人类可读的,并提供有关其创建时间的有用信息。

    缺点:

    • 如果这是一个 Web 应用程序(或其他类型的多线程进程),如果同时生成两个文件,则有(很小)机会获得相同的名称。如果这是单线程 EXE,这不是问题。

    【讨论】:

    • 这比使用 GUID 好,只要没人更改系统时间... ;-)
    • 如果两个不同的进程/线程试图在完全相同的时刻保存会发生什么?
    • 试一试,如果不能保存,创建一个新的日期等?
    • 分数在这里买不起。您从 DateTime 获得的分辨率通常为 16 毫秒。你可以比这更准确,但这不是你从系统时间中得到的。不过,您可以使用高性能计数器。
    • @Bobby:如果这是一个流量很大的网络应用程序,那么中奖的机会就会大大增加。
    【解决方案4】:

    使用 GUID 命名您的图像

    对于 C#,您可以使用:System.Guid.NewGuid().ToString()

    【讨论】:

      【解决方案5】:

      如果要保存图片,可以只使用 GUID 作为文件名:

      string filename = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".jpg");
      

      当我需要 .tmp 以外的其他文件扩展名(通过 GetTempFileName 创建文件时会获得哪些文件)时,我总是这样做。
      当然你可以通过 GetTempFileName 创建文件然后重命名它们,但是你必须再次检查是否存在具有新名称的文件...

      【讨论】:

        【解决方案6】:

        我也会选择 GUID 解决方案。

        这里有一些我会经常使用的代码:

        public static string GetRandomFileName(string extension)
        {
            StringBuffer sb = new StringBuffer(Guid.NewGuid().ToString());
            if (!string.IsNullOrEmpty(extensions))
            {
                sb.Append(".");
                sb.Append(extension);
            }
        
            return sb.ToString();
        }
        

        将为您提供可重复使用的优良解决方案。将其放入您的“我最伟大时刻的收藏” - 类库中,您就可以开始了。

        【讨论】:

        • 在这种情况下你不需要 StringBuilder,它可能比普通的字符串函数慢。
        • 我假设您的意思是使用 StringBuilderStringBuffer 更多的是 Java...)。如果你想充分利用 StringBuilder,你需要用你要使用的大小来初始化它。在这种情况下,您知道结果字符串的完整长度,因此您可以利用它:StringBuffer sb = new StringBuilder(Guid.NewGuid().ToString("N"), 33 + extension.Length);,或者如果您可以假设扩展名是 3 个字符:StringBuffer sb = new StringBuilder(Guid.NewGuid().ToString("N"), 36);
        • 对不起,我记错了,当然是StringBuilder。我在这里使用它的原因是,我认为一遍又一遍地使用相同的编码方式总是更可取。如果出现性能问题,还有时间修改代码(优化),但我不认为这个例程会成为决定因素。不过,非常感谢您提出的关于缓冲区大小的启发性想法!
        【解决方案7】:

        这是一个内置方法Path.GetRandomFileName。它返回一个随机的文件夹名或文件名。

        GetRandomFileName 方法返回一个 加密性强,随机 可以用作任一字符串 文件夹名或文件名。不像 获取临时文件名、获取随机文件名 不创建文件。当。。。的时候 您的文件系统的安全性是 最重要的是,应该使用这种方法 而不是 GetTempFileName。

        如果你想使用你的扩展(例如.jpg而不是生成的),你可以使用另一个帮助方法Path.ChangeExtension

        string extension = ".jpg";
        string fileName = Path.ChangeExtension(
            Path.GetRandomFileName(),
            extension
        );
        

        System.IO.Path.GetRandomFileName 获取保证唯一的文件名

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-26
          相关资源
          最近更新 更多