c#使用handle.exe解决程序更新文件被占用的问题攻略
在程序更新过程中,经常会遇到文件被占用的问题导致更新失败。此时可以使用handle.exe工具定位占用文件的进程并关闭占用进程,以解决文件被占用的问题。下面是使用c#调用handle.exe工具实现解决文件被占用问题的步骤:
1.下载handle.exe
handle.exe是Sysinternals Suite工具包中的一个小工具。下载地址为:https://docs.microsoft.com/en-us/sysinternals/downloads/handle。
2.调用handle.exe
可以使用Process类调用handle.exe工具。具体代码如下:
using System.Diagnostics;
public static bool StopProcessWithFilePath(string filePath)
{
try
{
Process process = new Process();
process.StartInfo.FileName = "handle.exe"; // handle.exe的路径
process.StartInfo.Arguments = $"\"{filePath}\" /accepteula"; // 需要关闭的文件路径,/accepteula是为了同意Sysinternals的许可协议
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
string output = process.StandardOutput.ReadToEnd();
if (output.Contains("No matching handles found"))
{
return true;
}
return false;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return false;
}
}
StopProcessWithFilePath方法让handle.exe对指定的文件进行检测,如果发现有进程在占用,就会将进程关闭。调用方式可以如下:
bool isSuccess = StopProcessWithFilePath("C:\update\update.exe");
if(isSuccess)
{
Console.WriteLine("成功关闭update.exe进程");
}
else
{
Console.WriteLine("没有找到update.exe进程");
}
3.使用handle.exe定位占用进程
如果上述方法无法解决文件被占用问题,可以使用handle.exe的命令行模式查看是哪个进程在占用文件。具体代码如下:
public static string GetProcessWithFilePath(string filePath)
{
try
{
Process process = new Process();
process.StartInfo.FileName = "handle.exe"; // handle.exe的路径
process.StartInfo.Arguments = $"\"{filePath}\""; // 需要查看的文件路径
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
string output = process.StandardOutput.ReadToEnd();
string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
if (line.Contains(":"))
{
string[] parts = line.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 2 && parts[1].Trim() != "")
{
return parts[1].Trim();
}
}
}
return null;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return null;
}
}
GetProcessWithFilePath方法让handle.exe对指定的文件进行检测,返回文件被那个进程占用。调用方式可以如下:
string processName = GetProcessWithFilePath("C:\update\update.exe");
if (!string.IsNullOrEmpty(processName))
{
Console.WriteLine("update.exe进程被{0}占用", processName);
}
else
{
Console.WriteLine("没有找到占用update.exe进程");
}
示例
示例1
有两个同名的文件,file1.txt和file2.txt,位于不同的目录下,都被占用了。我们需要关闭占用这两个文件的进程。调用方式可以如下:
StopProcessWithFilePath("C:\path1\file1.txt");
StopProcessWithFilePath("C:\path2\file2.txt");
如果进程被找到并关闭,StopProcessWithFilePath方法会返回true;如果进程没有被找到,会返回false。
示例2
假设我们要升级一个应用程序,升级过程中发现有个文件update.exe一直被占用无法覆盖,我们需要查看占用update.exe的进程并将其关闭。调用方式可以如下:
string processName = GetProcessWithFilePath("C:\update\update.exe");
if (!string.IsNullOrEmpty(processName))
{
StopProcessWithFilePath(processName);
Console.WriteLine("成功关闭update.exe进程");
}
else
{
Console.WriteLine("没有找到占用update.exe进程");
}
GetProcessWithFilePath方法返回占用update.exe的进程名。StopProcessWithFilePath方法关闭该进程。如果成功关闭进程,Console会输出"成功关闭update.exe进程";如果没有找到占用update.exe的进程,Console会输出"没有找到占用update.exe进程"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 使用handle.exe解决程序更新文件被占用的问题 - Python技术站