使用 C# 修改文件创建时间(图片也可修改)

收到一个需求,希望修改指定文件的创建时间,并且文件数上千。所以希望通过程序来解决。用户的真实意图暂且不论,首先分析这个事情是否可行,立马搜索几篇文章一扫,得可行结论。既然可行那接下来就朝着实现的方向去搜索,修改方法还停简单。虽然这些功能没有对用户开放,但对于程序来说简直容易到不要不要的。

下面是这个工具的界面:

由于是 Windows 桌面应用程序,所以在目标框架的选择上选择了 .NET Framework 2.0,这样做会损失很多的开发便利,但是可以提高用户的体验,只要用户在 Windows 10 或以上系统100%可运行,不需要单独安装框架,因为 .NET Framework 2.0 属于系统默认组件。

 

下面是核心代码,首先通过用户选择的目标文件夹,找到文件夹下的所有文件,并遍历所有文件将文件的日期改为用户输入的指定日期。

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        var path = txtPath.Text.Trim();
        if (string.IsNullOrEmpty(path))
        {
            button2_Click(sender, e);
            return;
        }
        var source = new DirectoryInfo(path);

        var fileList = source.GetFiles();

        if (fileList == null || fileList.Length == 0)
        {
            ShowMessage("看起来这个文件夹里面没有文件,请重新选择");
            return;
        }

        var date = txtCreateTime.Text.Trim();
        if (date.Length > 10 || !date.Contains("-"))
        {
            ShowMessage("日期格式错误,正确格式为:" + DateTime.Now.ToString("yyyy-MM-dd"));
            return;
        }

        if (DateTime.Parse(date).Year < 1980)
        {
            ShowMessage("日期必须大于 1980 年");
            return;
        }

        var r = new Random();
        foreach (var item in fileList)
        {
            item.CreationTime = DateTime.Parse(date + item.CreationTime.ToString(" HH:mm:ss"));
            item.LastWriteTime = DateTime.Parse(date + item.LastWriteTime.ToString(" HH:mm:ss"));

            // 如果出现创建时间大于访问时间,将访问时间一并修改
            if (item.CreationTime > item.LastAccessTime)
            {
                var accessTime = item.CreationTime.AddHours(1).AddMinutes(r.Next(1, 20)).AddSeconds(3);
                item.LastAccessTime = accessTime;
            }
        }
        lblMessage.Text = "修改完成";
    }
    catch (Exception ex)
    {
        ShowMessage(ex.Message);
    }
}

public void ShowMessage(string message)
{
    lblMessage.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:") + message;
}

前面是一些参数判断,并将焦点设置的一些提升用户体验的代码,要说真正核心就下面两句:

var source = new DirectoryInfo(path);
var fileList = source.GetFiles();
foreach (var item in fileList)
{
    item.CreationTime = DateTime.Parse(date + item.CreationTime.ToString(" HH:mm:ss"));
    item.LastWriteTime = DateTime.Parse(date + item.LastWriteTime.ToString(" HH:mm:ss"));
}

另外发现一个有趣的现象,日期低于或高于某个点,在当前系统中(Windows Server 2019 版本 10.0.17763.1217)不会显示出来。下面分别修改过高和过低的日期大家看一下,这是文件的初始状态:

所以为了避免被用户玩坏,如果用户输入过低的日期就提示用户,后来想想也许这个判断会影响到用户,现在看起来用户的修改时间范围还没有夸张到跨世纪(因为还没人来问我什么)。好了需求实现并交付。留下一篇记录供参考。

源码下载:https://download.csdn.net/download/S2T11Enterprise/12527655

该工具主要是将照片批量修改拍摄时间,15秒时间完成超过 3000 张照片修改。

如有商业合作请QQ联系:380086154

posted @ 2020-06-23 12:57  Jöhan  阅读(1530)  评论(0编辑  收藏  举报