使用C#监控文件访问记录
在某些场景下,我们需要监控特定文件或目录的访问情况。例如,当系统中有大量音乐文件时,我们可能希望知道哪些文件被播放器打开并播放。以下是如何通过C#实现这一功能。
1. 使用FileSystemWatcher监控文件变化
首先,我们可以使用FileSystemWatcher类来监听文件系统的变更。下面是一个简单的示例代码:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
string path = @"D:\Music"; // 替换为你的目标目录路径
FileSystemWatcher watcher = new FileSystemWatcher(path);
// 设置需要监听的属性
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite;
watcher.Filter = "*.*"; // 监听所有类型的文件
// 添加事件处理程序
watcher.Changed += OnFileChanged;
// 开始监听
watcher.EnableRaisingEvents = true;
Console.WriteLine("正在监听文件访问... 按 'q' 退出");
while (Console.Read() != 'q') { }
}
private static void OnFileChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"文件 {e.FullPath} 被访问了!");
}
}
上述代码会监听指定目录下的文件访问和修改操作。但需要注意的是,在Windows Vista及更高版本中,默认情况下不会更新文件的"LastAccess"时间戳。因此,我们需要手动调整注册表设置。
2. 修改注册表以启用LastAccess更新
为了确保FileSystemWatcher能够正确检测到文件访问,我们需要关闭NTFS文件系统的"禁用LastAccess更新"选项。可以通过修改注册表实现这一点:
using Microsoft.Win32;
class RegistryManager
{
public static void EnableLastAccessUpdate()
{
try
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\FileSystem", true))
{
if (key != null)
{
object currentValue = key.GetValue("NtfsDisableLastAccessUpdate");
Console.WriteLine($"当前值: {currentValue}");
// 将值设置为0以启用LastAccess更新
key.SetValue("NtfsDisableLastAccessUpdate", 0, RegistryValueKind.DWord);
Console.WriteLine("已成功启用LastAccess更新!");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
运行此代码后,系统将开始更新文件的"LastAccess"时间戳。
3. 请求管理员权限
由于修改注册表需要管理员权限,因此必须确保程序以管理员身份运行。这可以通过配置应用程序清单文件(App.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">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
将上述内容添加到项目的App.Manifest文件中,即可在运行时请求管理员权限。
4. 注意事项
- 在调试过程中,Visual Studio可能会继承其自身的权限,导致无法触发UAC提示。建议直接生成可执行文件并手动运行。
- 如果仅用于个人用途,可以考虑手动修改注册表,而无需在程序中实现该功能。
通过以上步骤,你可以成功监控文件的访问记录,并根据需求进一步扩展功能。