我创建了一个截图程序,一切都很好。唯一的问题是,我不确定如何制作它,因此屏幕截图与附加数字一起保存。
示例:屏幕截图 1、屏幕截图 2、屏幕截图 3、屏幕截图 4 等。
显然,这可以应用于正在保存的其他文件。有任何想法吗?谢谢你。
这是我经常用于这种情况的一种方法。只需传入一个像“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;
}
(注意:这是一个稍微简化的版本,不考虑文件扩展名)。
你使用数字是有原因的吗?以后会在另一个会话中重新使用同一个文件夹吗?如果日期不同,是否应该重新启动数字并替换现有文件?
这些是要记住的事情。值得注意的是,OS X 曾经在截屏时提供“图片 1”、“图片 2”,幸好在新版本中它现在使用“截屏于 2009-12-08 11.35.12”或类似的东西,允许更容易按日期排序,轻松避免命名冲突等。
正如在其他建议中发布的那样,您仍然需要检查文件是否已经存在,并且当您重试 DateTime.Now 时会有所不同,因此文件名也会有所不同。当然,除非屏幕截图在同一毫秒内或用户弄乱了日期/时间(或者夏令时也会让您感到困惑),否则您不应该遇到任何冲突。
这是 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
函数,而不是进行基于字符串的连接,以避免托管服务器上的错误。您永远不知道网站将如何托管 - 子域、根站点等。
由于您正在编写文件,因此一种方法是搜索当前保存目录并找到名为 ScreenshotXX 的最新文件,然后使用正则表达式从名称中获取数字。
为此,您可以使用DirectoryInfo
该类和Regex
该类。
解决方案总结
这对你有用吗?
这就是我使用的:
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");