【发布时间】:2011-10-26 03:19:33
【问题描述】:
我多次遇到这个问题,我想在同一个目录中拥有同一个文件的多个版本。我一直在使用 C# 的方式是在文件名中添加一个时间戳,类似于 DateTime.Now.ToString().Replace('/', '-').Replace(':', '.')。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: c# .net file datetime file-io
我多次遇到这个问题,我想在同一个目录中拥有同一个文件的多个版本。我一直在使用 C# 的方式是在文件名中添加一个时间戳,类似于 DateTime.Now.ToString().Replace('/', '-').Replace(':', '.')。
有没有更好的方法来做到这一点?
【问题讨论】:
标签: c# .net file datetime file-io
您可以使用DateTime.ToString Method (String)
DateTime.Now.ToString("yyyyMMddHHmmssfff")
string.Format("{0:yyyy-MM-dd_HH-mm-ss-fff}", DateTime.Now);
$"{DateTime.Now:yyyy-MM-dd_HH-mm-ss-fff}"
有以下自定义格式说明符 y(年)、M(月)、d (天)、h(12 小时)、H(24 小时)、m(分钟)、s(秒)、f(秒) 分数),F(第二个分数,尾随零被修剪),t(P.M或 A.M) 和 z(时区)。
带扩展方法
用法:
string result = "myfile.txt".AppendTimeStamp();
//myfile20130604234625642.txt
扩展方法
public static class MyExtensions
{
public static string AppendTimeStamp(this string fileName)
{
return string.Concat(
Path.GetFileNameWithoutExtension(fileName),
DateTime.Now.ToString("yyyyMMddHHmmssfff"),
Path.GetExtension(fileName)
);
}
}
【讨论】:
Path.GetDirectoryName(fileName) 以获取文件的完整路径。然后将string.Concat()替换为Path.Combine()获取完整文件名。
我更喜欢使用:
string result = "myFile_" + DateTime.Now.ToFileTime() + ".txt";
ToFileTime() 有什么作用?
将当前 DateTime 对象的值转换为 Windows 文件时间。
public long ToFileTime()Windows 文件时间是一个 64 位值,表示自公元 1601 年 1 月 1 日午夜 12:00 (C.E.) 协调世界时 (UTC) 以来经过的 100 纳秒间隔数。 Windows 使用文件时间来记录应用程序何时创建、访问或写入文件。
【讨论】:
也许附加 DateTime.Now.Ticks 会稍微快一点,因为您不会创建 3 个字符串,并且刻度值也将始终是唯一的。
【讨论】:
你可以使用:
Stopwatch.GetTimestamp();
【讨论】:
你可以用下面的代替:
DateTime.Now.Ticks
【讨论】:
在 maf-soft 的回答的帮助下,我创建了自己的解决方案,它也可以处理 Pathes。
所以这些是我使用的单元测试:
Assert.Test(new MyPathTools().AppendTimeStamp(@"AnyFile.pdf", new FakeMyDateTime("15.2.2021 15:23:17")),
@"AnyFile20210215152317.pdf");
Assert.Test(new MyPathTools().AppendTimeStamp(@"C:\Temp\Test\", new FakeMyDateTime("15.2.2021 15:23:17")),
@"C:\Temp\Test\20210215152317");
Assert.Test(new MyPathTools().AppendTimeStamp(@"C:\Temp\Test\AnyFile.pdf", new FakeMyDateTime("15.2.2021 15:23:17")),
@"C:\Temp\Test\AnyFile20210215152317.pdf");
代码(用于复制和粘贴)如下所示:
public class MyPathTools
{
public string AppendTimeStamp(string fileName)
{
return Path.Combine(Path.GetDirectoryName(fileName), string.Concat(Path.GetFileNameWithoutExtension(fileName),
DateTime.Now.ToString("yyyyMMddHHmmss"),
Path.GetExtension(fileName))
);
}
}
适用于我的框架的代码(并且是可单元测试的)如下所示:
public class MyPathTools : IMyPathTools
{
public string AppendTimeStamp(string fileName, IMyDateTime myDateTime)
{
return Path.Combine(Path.GetDirectoryName(fileName), string.Concat(Path.GetFileNameWithoutExtension(fileName),
myDateTime.Now.ToString("yyyyMMddHHmmss"),
Path.GetExtension(fileName))
);
}
}
【讨论】: