zoukankan      html  css  js  c++  java
  • 使用 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

  • 相关阅读:
    ES6-Object
    ES6-Iterator
    ES6-Generator
    ES6-fetch
    ES6-Function
    ES6-Array
    ES6-Class
    SQLite使用事务更新—by command
    交款功能代码
    SQLite本地事务处理
  • 原文地址:https://www.cnblogs.com/fxck/p/13435087.html
Copyright © 2011-2022 走看看