使用 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章