【发布时间】:2011-02-18 12:14:21
【问题描述】:
当我添加图片时,我希望它创建一个新的随机文件名,因为如果添加同名图片,它只会覆盖。
【问题讨论】:
-
您应该更加努力地构建您的问题。向我们展示一些代码或描述您正在做什么。
-
显然你不一定想要一个 »random« 而是一个 »unique« 文件名。这两者可能非常不同。
-
独特也是一个机会,但我该怎么做呢?
当我添加图片时,我希望它创建一个新的随机文件名,因为如果添加同名图片,它只会覆盖。
【问题讨论】:
也许您正在寻找GetTempFileName。
【讨论】:
.tmp 结尾或驻留在$Env:TEMP 中。我会应用常识和一些启发式方法;-)
您可以生成一个 Guid 并将其用作您的文件名。虽然这意味着这些文件不是人类可读的,并且没有关于内容是什么的信息。
【讨论】:
您可以使用当前时间构建它。
string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
上面的示例将使用年、月、日、小时、分钟、秒和秒的小数部分来格式化当前时间。 (如果您希望将秒数减少到一秒,则可以使用更少的fs 指定秒数。)。
【讨论】:
使用 GUID 命名您的图像
对于 C#,您可以使用:System.Guid.NewGuid().ToString()
【讨论】:
如果要保存图片,可以只使用 GUID 作为文件名:
string filename = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".jpg");
当我需要 .tmp 以外的其他文件扩展名(通过 GetTempFileName 创建文件时会获得哪些文件)时,我总是这样做。
当然你可以通过 GetTempFileName 创建文件然后重命名它们,但是你必须再次检查是否存在具有新名称的文件...
【讨论】:
我也会选择 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(StringBuffer 更多的是 Java...)。如果你想充分利用 StringBuilder,你需要用你要使用的大小来初始化它。在这种情况下,您知道结果字符串的完整长度,因此您可以利用它:StringBuffer sb = new StringBuilder(Guid.NewGuid().ToString("N"), 33 + extension.Length);,或者如果您可以假设扩展名是 3 个字符:StringBuffer sb = new StringBuilder(Guid.NewGuid().ToString("N"), 36);。
这是一个内置方法Path.GetRandomFileName。它返回一个随机的文件夹名或文件名。
GetRandomFileName 方法返回一个 加密性强,随机 可以用作任一字符串 文件夹名或文件名。不像 获取临时文件名、获取随机文件名 不创建文件。当。。。的时候 您的文件系统的安全性是 最重要的是,应该使用这种方法 而不是 GetTempFileName。
如果你想使用你的扩展(例如.jpg而不是生成的),你可以使用另一个帮助方法Path.ChangeExtension:
string extension = ".jpg";
string fileName = Path.ChangeExtension(
Path.GetRandomFileName(),
extension
);
System.IO.Path.GetRandomFileName 获取保证唯一的文件名。
【讨论】: