我正在编写一些 C# 代码,需要在应用程序运行时检测 Windows 文件系统上的特定文件夹是否已被打开。有没有什么方法可以做到?也许可以使用 WinAPI?
我正在编写一些 C# 代码,需要在应用程序运行时检测 Windows 文件系统上的特定文件夹是否已被打开。有没有什么方法可以做到?也许可以使用 WinAPI?
使用Windows Shell扩展。您可以使用Shell Namespace扩展来创建一个“虚拟”文件夹(或隐藏实际文件夹),例如GAC(C:\ Windows \ assembly)
列处理程序会在打开文件夹时通知您,并且甚至让您为每个文件提供额外的数据(新的详细信息列)。
BackgroundWorker folderWorker = new BackgroundWorker();
folderWorker.WorkerReportsProgress = true;
folderWorker.WorkerSupportsCancellation = true;
folderWorker.DoWork += FolderWorker_DoWork;
folderWorker.ProgressChanged += FolderWorker_ProgressChanged;
folderWorker.RunWorkerAsync();
void FolderWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
while(!worker.CancellationPending)
{
DateTime lastAccess = Directory.GetLastAccessTime(DIRECTORY_PATH);
//Check to see if lastAccess falls between the last time the loop started
//and came to end.
if(/*your check*/)
{
object state; //Modify this if you need to send back data.
worker.ReportProgress(0, state);
}
}
}
void FolderWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//Take action here from the worker.ReportProgress being invoked.
}
您可以使用FileSystemInfo的LastAccessProperty。但问题在于它可能会被缓存。
FileSystemInfo: http://msdn.microsoft.com/en-us/library/975xhcs9.aspx
LastAccessTime Property: http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.lastaccesstimeutc.aspx
请注意,这可能会被预缓存。
"如果FileSystemInfo对象的当前实例是从以下任何DirectoryInfo方法返回的,则LastAccessTimeUtc属性的值将被预缓存:
GetDirectories
GetFiles
GetFileSystemInfos
EnumerateDirectories
EnumerateFiles
EnumerateFileSystemInfos
要获取最新值,请调用Refresh方法。"
因此,调用Refresh方法可能仍然无法更新到最新值,因为Windows缓存该值。根据msdn文档所述:“FileSystemInfo.Refresh从当前文件系统中获取文件的快照。即使文件系统返回不正确或过时的信息,Refresh也无法更正底层文件系统。这在诸如Windows 98之类的平台上可能会发生。”- 链接:http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh.aspx请查看FileSystemWatcher类。
我认为你可靠地实现这一点的唯一方法是监视当前运行的进程,并密切关注新的Explorer.exe实例和/或新的Explorer.exe生成的线程(“在单独的进程中运行每个窗口”设置会妨碍此处)。
我承认我不知道如何编写代码,但这就是我要寻找的。