閱讀454 返回首頁    go 技術社區[雲棲]


C# 係統應用之獲取Windows最近使用記錄

由於畢業設計項目需要刪除Windows最近曆史記錄,這就需要獲取Windows最近曆史記錄 Recent.本文就主要敘述通過C#實現獲取Recent中使用的文件和文件夾.首先聲明該文章主要是結合自己的畢設項目,同時的主要代碼來自Level Up的博客.在此非常感謝該博主,也希望大家學習他的文章: https://www.dotblogs.com.tw/larrynung/archive/2012/09/27/75118.aspx

一.Windows最近曆史記錄

在Windows係統中有Recent Items或Recent這樣的東西存儲最近使用的文件和文件夾的曆史記錄,通過快捷鍵"Windows+R"打開運行輸入"recent"可以打開最近瀏覽文件和文件夾如下圖所示:

當我們瀏覽文件時,它會自動的以快捷的方式存儲曆史記錄,Windows會自動添加到該文件夾下記錄係統最近使用的文件或文件夾,同樣Office、Cookies等都有相對應的Recent.我們可以通過Environment.GetFolderPath(Environment.SpecialFolder.Recent)獲取Windows的Recent最近曆史記錄的位置,我電腦中recent的路徑為 "C:\Users\dell\AppData\Roaming\Microsoft\Windows\Recent".
同時由於該獲取較簡單,就不詳細敘述.補充C#獲取桌麵、Recent、我的文檔、我的音樂、Cookies等路徑參考文章https://hi.baidu.com/ysuhy/item/b12a57d3660ccc90270ae7f9

二.遍曆Recent中文件路徑

在遍曆Recent目錄時,遍曆方法參考了Level Up的文章"[C#][VB.NET].NET捷徑(ShortCut)控製"如下圖"dota2.txt"的捷徑(ShortCut),通過目標獲取Recent快捷鍵的原始存放路徑.

這裏Level Up作者整理了一個類,通過這個類實現獲取文件原始路徑,右鍵項目"添加"類,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;              //Directory 目錄 
using System.Reflection;      //BindingFlags 枚舉

namespace GetPathRecent
{
    public class RecentlyFileHelper
    {
        public static string GetShortcutTargetFile(string shortcutFilename)
        {
            var type = Type.GetTypeFromProgID("WScript.Shell");  //獲取WScript.Shell類型
            object instance = Activator.CreateInstance(type);    //創建該類型實例
            var result = type.InvokeMember("CreateShortCut", BindingFlags.InvokeMethod, null, instance, new object[] { shortcutFilename });
            var targetFile = result.GetType().InvokeMember("TargetPath", BindingFlags.GetProperty, null, result, null) as string;
            return targetFile;
        }

        public static IEnumerable<string> GetRecentlyFiles()
        {
            var recentFolder = Environment.GetFolderPath(Environment.SpecialFolder.Recent);  //獲取Recent路徑
            return from file in Directory.EnumerateFiles(recentFolder)
                   where Path.GetExtension(file) == ".lnk"
                   select GetShortcutTargetFile(file);
        }
    }
}

三.顯示路徑listBox1控件中

向Form中添加控件listBox和fileSystemWatcher(監控文件係統更改通知,並在目錄或文件更改時引發事件).具體代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GetPathRecent
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //載入Form 
        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.Items.Clear();            
            foreach (var file in RecentlyFileHelper.GetRecentlyFiles())
            {
                listBox1.Items.Add(file);
            }

            //獲取recent路徑
            var recentFolder = Environment.GetFolderPath(Environment.SpecialFolder.Recent);
            fileSystemWatcher1.Path = recentFolder;
            fileSystemWatcher1.Created += new System.IO.FileSystemEventHandler(fileSystemWatcher1_Created);
        }

        //當在指定Path(即recent路徑)中創建文件和目錄時增加ShortCut
        private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
        {
            listBox1.Items.Add(RecentlyFileHelper.GetShortcutTargetFile(e.FullPath));
        }
    }
}

四.運行結果

顯示Recent中Windows最近瀏覽的文件及文件夾原始路徑運行結果如下:

其中與"一.Windows曆史記錄"中圖對應,亦可以發現dota2.txt是對應捷徑"G:\dota2\dota2.txt"證明了文章.到此,我們就獲取到了Windows的最近曆史記錄,要實現清除Recent的曆史記錄也非常容易,同時清除指定U盤中的文件記錄也可以實現.同樣如果想刪除Office最近曆史記錄路徑為"C:\Users\dell\AppData\Roaming\Microsoft\Office\Recent".如下圖所示:

五.總結及感謝

該文章主要是結合自己的畢業設計中U盤清除Windows曆史記錄、Office曆史記錄設計完成,同時查看了很多資料和書籍,其中給予我幫助最大的是level up的文章,由於這方麵的資料較少,所以彌足珍貴.同時聲明該文章的代碼主要參考了Level Up的博客https://www.dotblogs.com.tw/larrynung/archive/2012/09/27/75118.aspx
最後,希望文章對大家有所幫助,同時希望大家去關注上麵提到博主的文章,他寫了很多文章,都非常有用,無論是技術性還是理論性.如果該篇文章中有錯誤或不足之處,請大家海涵!
(By:Eastmount 2014-1-19 夜4點https://blog.csdn.net/eastmount)

最後更新:2017-04-03 12:54:38

  上一篇:go Windows係統時間轉化為固定長度為8位的字符串
  下一篇:go C#之&quot;0x{0:x}&quot;