C#如何检查是否有正在进行中的复制任务

3
我正在尝试找到一种使用C#语言检查是否有任何复制作业正在进行的方法,因为我需要重新启动explorer.exe进程来刷新应用程序更改的某些设置。所以我想避免破坏正在进行中的任何复制过程。
这里是否有人有好的技巧来解决这个问题?
提前致谢

2
@zey 这就是 OP 正在尝试找出的问题。并不是每个问题都以“为什么我写的这段代码不起作用?”开头。 - Wim Ombelets
嗨。没错。我没有任何代码片段。我只是想了解是否可能以及如何实现它。谢谢。 - user2964193
2
如果您需要重新启动explorer.exe,我建议您不仅检查是否正在进行复制/移动作业,而是要求用户确认其是否可以执行此操作。人们可能会在后台打开许多文件夹,他们可能正在运行一些设置对话框或控制面板,而您的应用程序会关闭它们,这是不公平的。最好礼貌地询问并通知将要发生的事情。 - Karl-Johan Sjögren
1
好的,我希望这个链接能对你有所帮助 :) > https://dev59.com/QUnSa4cB1Zd3GeqPRdRf - zey
嗨,Karl-Johan Sjögren。我同意你的看法。那确实应该是最好的方法。然而,即使用户不在场,通过安装在客户端上的代理程序,这个应用程序也会被启动,所以我不想让应用程序挂起等待某些用户操作。 - user2964193
嗨,Zey。实际上我已经看过那篇文章了,但我不确定它是否“解决”了我的问题,因为当我的应用程序启动时,复制作业可能已经在进行中了,如果我理解正确的话,文件系统监视器只会在带有文件系统监视器的应用程序已经运行时通知您是否已经开始了复制作业。我是对的还是我错过了什么? - user2964193
2个回答

1
我在这里冒险猜测,但据我所知,这不在Windows复制命令(众所周知的有限)的可能性范围内。
然而,RoboCopy(以及其他类似的工具)支持在完成时返回值。
只要未收到返回值,这将使您轻松防止资源管理器进程的(自动)终止(手动终止当然仍然可能)。
由于您说复制不是由您发起的,因此值得使用FileSystemWatcher,虽然它也有其限制需要注意。

嗨,Wim。问题在于复制作业没有为我提出。所以我想知道的是,在我启动应用程序之前是否有正在运行的复制作业,以延迟重新启动资源管理器进程。我相信这是一项艰巨的任务... - user2964193
@user2964193 FileSystemWatcher 可能有一些你可以使用的功能(注意:链接到编辑答案中的限制)。 - Wim Ombelets
谢谢您的回复。那么我的下一个问题是,如果我只在启动了实现FileSystemLauncher的应用程序后才开始复制作业,那么我是否会收到来自FileSystemWatcher的通知,也就是说,在复制作业已经开始并正在进行时。您知道在这种情况下它是否有效吗?谢谢。 - user2964193
我不能凭记忆说,但值得测试。最大的问题是,在操作系统级别检查打开的文件句柄会迫使你离开托管代码的舒适区域,跳入谚语中的深渊……这不是我的菜,恐怕。 - Wim Ombelets
好的,这肯定是一项艰巨的任务 :) 非常感谢你的帮助。 - user2964193

1
你可以尝试获取explorer.exe的页面故障增量计数器。请参见this link。如果数字很高(我知道这不是精确科学),则表示有些事情正在发生(也许是复制?)。
这不会给你一个明确的答案,而是一个提示。即使页面故障很低甚至为零,复制仍然可能在进行中 - 例如当复制显示提示给用户时,等待网络等。 你可以监视该进程几秒钟,如果页面故障很低,请询问用户是否可以重新启动该进程。
未经测试的想法,但值得探索。

我尝试过检查这种方法,但是我无法得出明确的结论,因此我更喜欢使用比这个更精确的另一种方法。不管怎样,还是谢谢。 - user2964193

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接