首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何才能了解哪个进程会删除硬盘上的文件

如何才能了解哪个进程会删除硬盘上的文件
EN

Stack Overflow用户
提问于 2018-08-02 20:59:43
回答 3查看 2.7K关注 0票数 9

我有以下问题。我开发了一个将设置保存在首选项文件中的应用程序。在某个时间点,其中一个文件将被删除。无法从我的应用程序中删除此文件。

在Windows下,如何了解哪个进程会删除硬盘上的文件?

编辑:这个问题很少出现。我正在寻找一个可以作为服务或其他东西运行的程序,这样我就可以为应用程序打一个补丁,如果有人删除了文件并写入了它已经完成的进程,则可以在运行时监视该补丁。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-07 16:18:49

如果您对C#解决方案没有意见,可以使用Microsoft.Diagnostics.Tracing.TraceEvent nuget包。它是ETW (Event Tracing for Windows)事件的包装器。

Windows内核会跟踪所有内容,您可以实时获取这些跟踪信息。但有时很难将它们联系起来。

在您的示例中,您将关注文件删除事件,但不幸的是,这些事件没有附加任何进程信息,因此我使用了另一个事件。下面是一些示例代码:

代码语言:javascript
复制
using System;
using Microsoft.Diagnostics.Tracing.Parsers;
using Microsoft.Diagnostics.Tracing.Session;

namespace TraceDeletes
{
    class Program
    {
        static void Main(string[] args)
        {
            if (TraceEventSession.IsElevated() != true)
            {
                Console.WriteLine("To turn on ETW events you need to be Administrator, please run from an Admin process.");
                return;
            }

            // we're watching that particular file
            string filePath = @"C:\temp\New Text Document.txt";
            ulong fileKey = 0;
            string processName = null;
            using (var session = new TraceEventSession("whatever"))
            {
                // handle console CTRL+C gracefully
                Console.CancelKeyPress += (sender, e) => session.Stop();

                // we filter on events we need
                session.EnableKernelProvider(
                    KernelTraceEventParser.Keywords.DiskFileIO |
                    KernelTraceEventParser.Keywords.FileIOInit);

                // this event has no process information
                session.Source.Kernel.FileIOFileDelete += data =>
                {
                    if (data.FileKey == fileKey)
                    {
                        Console.WriteLine(data.FileName + " was deleted by " + processName);
                        fileKey = 0;
                        processName = null;
                    }
                };

                // this event has process information (id, name)
                // it happens before delete, of course
                // we remember the FileKey
                session.Source.Kernel.FileIOQueryInfo += data =>
                {
                    if (string.Compare(data.FileName, filePath, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        fileKey = data.FileKey;
                        processName = data.ProcessName;
                    }
                };

                // runs forever, press CTRL+C to stop
                session.Source.Process();
            }
        }
    }
}

如果您创建了"C:\temp\New Text Document.txt“文件,然后使用Windows资源管理器将其删除,您应该会看到:

代码语言:javascript
复制
C:\temp\New Text Document.txt was deleted by explorer

注意: ETW当然可以使用其他语言,但是使用这个.NET库要容易得多。

票数 2
EN

Stack Overflow用户

发布于 2018-08-08 18:07:13

微软的Sysinternals应该可以帮助你。

https://docs.microsoft.com/en-us/sysinternals/downloads/

在文件和磁盘实用程序下查看。有一些实用程序可以显示哪个进程访问/修改给定的文件。

票数 0
EN

Stack Overflow用户

发布于 2018-08-13 13:56:41

您可以开发一个服务,使用FileSystemWatcher并监视已删除的事件。FileSystemWatcher.Deleted Event

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51654329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档