当前位置: 首页 > 编程语言 > C#

在Windows中处理系统文件夹事件分享

时间:2023-04-10 15:29:39 C#

在Windows中处理系统文件夹事件。解决办法是什么?WinAPI有可能吗?我认为您应该检查三个API:FindFirstChangeNotification()http://msdn.microsoft.com/en-us/library/aa364417%28VS.85%29.aspx用于查找特定文件、目录或目录树中文件的更改。它不会告诉您何时浏览目录,但会告诉您何时保存、重命名文件等。SetWindowsHookEx()http://msdn.microsoft.com/en-us/library/ms644990%28v=VS.85%29.aspx你可以设置它在发生任何数量的事件时给你一个回调-事实上我很漂亮确保在打开目录时可以获得此回调,但这可能非常困难,因为您将拦截到浏览器窗口的消息。因此,您将在调试期间重新启动。WindowsShellhttp://msdn.microsoft.com/en-us/library/bb776778%28v=VS.85%29.aspx如果这还不够痛苦,您可以尝试编写一个shell程序。如果你正在尝试编写一个rootkit,我想你不希望我破坏你的细节。如果您不想编写Rootkit,我建议您仔细研究一下。有开源rootkit,它们都必须以这种方式监视文件访问以隐藏用户/操作系统。使用Windows外壳扩展。您可以使用Shell命名空间扩展来创建一个不存在的“虚拟”文件夹(或隐藏真实文件夹),例如GAC(C:\Windows程序集)以下是.Net4.0中Shell扩展编码的几个示例.当文件夹“打开”时,列处理程序会通知您,甚至允许您为每个文件提供额外的数据(新的详细信息列)。查看FileSystemWatcher类。我能想到的最接近的事情,可能对你有用,是使用静态目录类。它提供了确定上次访问文件或目录的时间的方法。您可以设置一个BackgroundWorker来监视目录是否以指定的时间间隔被访问。使用DateTime来跟踪间隔的开始和结束,如果上次访问时间介于两者之间,则可以使用BackgroundWorker的ProgressChanged事件通知应用程序。BackgroundWorkerfolderWorker=newBackgroundWorker();folderWorker.WorkerReportsProgress=true;folderWorker.WorkerSupportsCancellation=true;folderWorker.DoWork+=FolderWorker_DoWork;folderWorker.ProgressChanged+=FolderWorker_ProgressChanged;folderWorker.RunWorkerAsync();voidFolderWorker_DoWork(objectsender,DoWorkEventArgse){BackgroundWorkerworker=(BackgroundWorker)sender;while(!worker.CancellationPending){DateTimelastAccess=Directory.GetLastAccessTime(DIRECTORY_PATH);//检查lastAccess是否落在循环最后一次开始//和结束之间。if(/*你的支票*/){对象状态;//如果需要回传数据修改这里。worker.ReportProgress(0,state);}}}voidFolderWorker_ProgressChanged(objectsender,ProgressChangedEventArgse){//在此处从正在调用的worker.ReportProgress采取行动。}您可以使用FileSystemInfo的LastAccessProperty。但问题是它可以被保存。FileSystemInfo:http://msdn.microsoft.com/en-us/library/975xhcs9.aspxLastAccessTime属性:http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.lastaccesstimeutc.aspx作为如前所述,这可以预先缓存。“如果从以下任何DirectoryInfo方法返回FileSystemInfo对象的当前实例,LastAccessTimeUtc属性的值将被预缓存:GetDirectoriesGetFilesGetFileSystemInfosEnumerateDirectoriesEnumerateFilesEnumerateFileSystemInfos要获取最新值,请调用Refresh方法。”因此,调用Refresh方法,但由于Windows缓存了该值,它仍然可能不是最新的。(这是根据msdn文档“FileSystemInfo.Refresh从当前文件系统获取文件的快照。即使文件系统返回不正确或过时的信息,Refresh也无法纠正底层文件系统。这可能发生在Windows98等平台上。”链接:http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh.aspx我认为实现这一目标的唯一方法是监视当前正在运行的进程并留意新进程一个Explorer.exe实例和/或由新的Explorer.exe产生的线程(“在单独的进程中运行每个窗口”设置是如何进入这里的)。我承认我不知道如何编写代码,butthisiswhatIwant以上就是C#学习教程:HandlingthesystemfoldereventsharinginWindows,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: