我创建了一个屏幕截图程序,一切运行良好。 唯一的问题是,我不知道如何才能做到这一点,以便屏幕截图以附加数字的形式保存。
示例:屏幕截图 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 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
函数,而不是进行基于字符串的连接,以避免托管服务器上出现错误。您永远不知道网站将如何托管 - 子域、根网站等。
由于您正在编写文件,一种方法是搜索当前保存目录并找到名为 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");