记录: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 承载进程  也许好使吧……

 

 

posted @ 2014-03-02 19:27  三台  阅读(1583)  评论(0编辑  收藏  举报