記錄:C#監視某個文件的打開記錄


首先,先說下為什么要搞這個:

1.首先,我的電腦里有5萬左右的目錄或文件,用於存放歌曲,數量眾多。
2.我不一定會用哪種軟件聽歌(不過也就是幾種而已)。
3.我想在聽歌的時候,檢測哪首首歌被打開,能獲取到我正在放那首歌,用來記錄播放順序(播放器是隨機播放的)。
4.【實例】我用一款“Ihear"播放器,開始播放歌曲,列表內有五萬首歌,真實存放地址目錄級數不確定,不知道這首歌具體在哪個目錄,當然總的目錄是確定的。我運行了一款”GetSong"軟件,開始監視Ihear播放器,一旦播放器開始獲取本地的歌曲文件開始播放,GetSong軟件就會獲取到是哪個文件被Ihear播放器讀取(包括音樂文件與歌詞文件),當然文件的絕對路徑是肯定要獲取到的。


以上就是我第一次和 陳希章 發的一個消息,向他詢問解決方案。

當然一開始,我是自己嘗試過的,FileSystemWatcher LastAccess 大家可以嘗試搜索這兩個關鍵字,這就是完成我上面描述的功能的解決方法。

當然,為了給別人使用,給程序加個 操作注冊表 的功能,還是挺好用的。


當然,實現起來,並不是您想想的那么簡單,如果真的直接就完成了,我也不會搞這個記錄,更不會去向陳大師發郵件……

1. 首先我們要使用這個東西,肯定要寫出類似的方法:(見 MSDN的附帶示例

復制代碼
    public static void Main()
    {
        Run();
    }

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public static void Run()
    {
        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"D:\Temp";
        /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess ;
        // Only watch text files.
        watcher.Filter = "*.txt";
        // Add event handlers.
        watcher.Changed += OnChanged;        
        // Begin watching.
        watcher.EnableRaisingEvents = true;
        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed.
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
    }
復制代碼

至於具體的解釋,就不說了。我是直接搬過來的代碼,有刪減,不保證直接就能編譯通過,請自行查錯。

正題來了——如果你和我一樣,用的是Win8系統,這個軟件是肯定不能正常使用的,因為:

在Vista后的計算機預設是關閉更新 LastAccess 的,所以我們在怎么開啟檔案,在檔案的屬性頁中他的存取日期都不會變動。

那知道了問題,就可以解決了,修改注冊表(至於如何手動修改,還是百度下吧,我不細說了):

將 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 下的 NtfsDisableLastAccessUpdate 給關閉,設成 0 就是關閉

這樣,就解決了我的問題,可是重點是,這個軟件,並不是我自己用的啊……那我們就給我們的軟件,加個自動修改注冊表?

復制代碼
        private static void RunRegistry()
        {
            RegistryKey regKey = Registry.LocalMachine;
            RegistryKey setKey = regKey.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\FileSystem", true);
            object val0 = setKey.GetValue("NtfsDisableLastAccessUpdate", null);
            
            Console.WriteLine("獲取到的注冊表的值是:\t" + val0);
            Console.WriteLine("輸入一個要修改的值吧,只能是 0 或者 1 哦。");

            string k1 = Console.ReadLine();
            if (k1 == "0" || k1 == "1")
            {
                setKey.SetValue("NtfsDisableLastAccessUpdate", k1, RegistryValueKind.String);
            }
            while (Console.Read() != 'q') ;
        }
復制代碼

這樣我們就能改注冊表了吧?不過此時想想,我們這個軟件竟然能改注冊表?簡直不可思議啊!權限夠不夠啊?安全性令人堪憂……

答案顯而易見……普通的權限,注冊表肯定是改不了的……

我們搜索一下:c# 獲得管理員權限 ,然后找個法子來解決我們的問題:(manifest 應用程序清單文件)

復制代碼
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">       
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>     
    </application>
  </compatibility> 
</asmv1:assembly>
復制代碼

請注意淺綠色高亮區域的值,我們選用的是 requireAdministrator

這樣,我們的項目在運行時,就會向“UAC”請求管理員權限了。

哦,還要注意一個細節問題,直接調試運行我們的項目,項目會繼承VS的權限的,他好像不會申請UAC,至於怎么獲取……
也許,我只是說也許,去掉項目屬性里的那個:調試/啟用 Visual Studio 承載進程  也許好使吧……


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: