确定可执行文件是否正在运行

时间:2017-03-03 11:08:29

标签: c#

我不知道我在这里做错了什么,但是当我没有运行时我正在尝试删除二进制文件,但如果它正在运行,则会显示一个消息框,告诉用户在删除之前关闭该程序。当我尝试这样做时,它会忽略消息框并尝试在文件运行时删除该文件,显然你不能这样做,所以它返回到这个:

  

System.UnauthorizedAccessException:'拒绝访问路径'C:\ cmctemp \ lcpol \ lcweb.exe'。

不确定为什么它没有显示消息框。

private void button5_Click(object sender, EventArgs e)
{
    Process[] pname = Process.GetProcessesByName("lcweb.exe");
    if (pname.Length == 0)
        if (File.Exists(@"C:\cmctemp\lcpol\lcweb.exe"))
            File.Delete(@"C:\cmctemp\lcpol\lcweb.exe");
        else
            MessageBox.Show("Please close the program before deleting!", "Information");
}

5 个答案:

答案 0 :(得分:5)

尝试这样做:

  private void button5_Click(object sender, EventArgs e)
  {
        Process[] pname = Process.GetProcessesByName("lcweb");
        if (pname.Length == 0 && File.Exists(@"C:\cmctemp\lcpol\lcweb.exe"))
            File.Delete(@"C:\cmctemp\lcpol\lcweb.exe");
        else
            MessageBox.Show("Please close the program before deleting!", "Information");
  }

我们删除的第一个更改" .exe"来自 GetProcessByName ,第二个我只是调整 if语句

我希望它可以帮到你。

答案 1 :(得分:3)

您遇到的问题是Process.GetProcessesByName不是有效的进程名称。来自.exe https://msdn.microsoft.com/en-us/library/z3w4xdc9(v=vs.110).aspx的文档:

  

processName 流程的友好名称。

所以你需要这个过程的友好名称。这可能是没有Process.GetProcessesByName("lcweb") 后缀的可执行文件:

Process.GetProcesses()
    .Where(p => p.MainModule.ModuleName == "lcweb.exe")

如果您确实需要按可执行文件的名称查找进程,则需要执行以下操作:

before

但是,您需要确保您的应用是64位,否则您将获得例外。

答案 2 :(得分:2)

首先,如果文件存在,您不必检查

https://msdn.microsoft.com/en-us/library/system.io.file.delete(v=vs.110).aspx

  

如果要删除的文件不存在,则不会抛出任何异常。

无法删除文件的原因很多,这就是为什么我建议 尝试<a> <b1> <c> <d> <e>1</e> </d> </c> </b1> <b2>1</b2> <b1> <c> <d /> </c> </b1> <b2>2</b2> <b1> <c> <d> <e>3</e> </d> </c> </b1> <b2>3</b2> </a> ,如果<a> <b1> <c> <d> <e>1</e> </d> </c> </b1> <b2>1</b2> </b1> <b2>2</b2> <b1> <c> <d> <e>3</e> </d> </c> </b1> <b2>3</b2> </a> 询问用户

Delete

答案 3 :(得分:0)

您的代码需要2个修复程序,第一个:不执行嵌套if / else不使用括号

private void button5_Click(object sender, EventArgs e)
    {
        Process[] pname = Process.GetProcessesByName("lcweb");
        if (pname.Length == 0)
        {
            if (File.Exists(@"C:\cmctemp\lcpol\lcweb.exe"))
                File.Delete(@"C:\cmctemp\lcpol\lcweb.exe");
        }
        else
        {
            MessageBox.Show("Please close the program before deleting!", "Information");
        }
    }

您将else与错误的if {

相关联

对于第二个修复,相应于DavidG的回答,Process.GetProcessesByName需要进程的友好名称,在您的情况下似乎是“lcweb”

答案 4 :(得分:-2)

添加括号以分隔if

private void button5_Click(object sender, EventArgs e)
{
    Process[] pname = Process.GetProcessesByName("lcweb");
    if (pname.Length == 0)
    {
        if (File.Exists(@"C:\cmctemp\lcpol\lcweb.exe"))
            File.Delete(@"C:\cmctemp\lcpol\lcweb.exe");
    }
    else
    {
        MessageBox.Show("Please close the program before deleting!", "Information");
    }
}