【问题标题】:C# Why does Process.Start("notepad.exe" myFile) is working and Process.Start("notepad++.exe" myFile) is not workingC# 为什么 Process.Start(\"notepad.exe\" myFile) 正在工作,而 Process.Start(\"notepad++.exe\" myFile) 不工作
【发布时间】:2022-08-07 18:25:37
【问题描述】:

两种情况下的代码都是相同的:

这是工作并在记事本中打开文本文件

editor = \"notepad.exe\";
if (File.Exists(briefingFile))
{
  Process.Start(editor, briefingFile);
}

这个是行不通的:

editor = \"notepad++.exe\";
if (File.Exists(briefingFile))
{
  Process.Start(editor, briefingFile);
}

这是相同的测试文件,我安装了记事本++。我还尝试用完整路径指定记事本++,但结果是一样的。 我没有打开记事本++,而是收到了尝试创建新文件或打开丢失文件的附加错误消息。

  • 第一条错误消息没有上下文,第二条错误消息说文件不存在,这就是所有可以不用猜测的说法。您需要包含更多信息。你给出的唯一东西是editor 的值,我倾向于相信这不是你遇到这些错误时设置的值。
  • briefing.txt 应该更改为完整路径 - 否则找不到它。
  • 因为普通的notepad.exe是在Windows环境路径变量中注册的。而记事本++不是。
  • 简报.txt 存在。我正在运行相同的代码,而只有“编辑器”正在更改。 \"briefing.txt\" 用记事本打开很好。但是当我尝试用记事本++打开相同的文件时,它会启动错误。这可能是由于 ++ 符号吗?
  • 我认为另一个问题可能是您尝试在user folder 中打开文件。并且根据访问权限,notepad++ 无法在那里读取。

标签: c#


【解决方案1】:

notepad.exe 文件是 Windows 的一部分,位于 Windows 文件夹中,该文件夹是默认搜索路径(环境变量)的一部分。 Notepad++.exe不是Windows 的一部分,因此它的主文件夹是不是默认搜索路径的一部分.

因此,要使用 Notepad++ 打开进程,您还必须知道程序的完整路径。

尝试完整路径时,请确保正确转义文件夹分隔符,并且必须确保在路径中考虑空格。在这种情况下,您看到C:\Program 错误的原因是您还没有考虑Program Files 中的空间。

editor = @"""C:\Program Files\Notepad++\notepad++.exe""";
try 
{
  Process.Start(editor, briefingFile);
}
catch(Exception ex)
{
   // Do something here
}

还要注意我是如何切换到异常处理程序而不是 File.Exists() 的。磁盘 I/O 是您应该更喜欢处理异常的少数几个地方之一。 File.Exists() 对此特别不利,should be avoided


这里的另一种选择是,如果您有足够的控制权让您的目标机器知道甚至安装了 Notepad++,那么您也有足够的控制权将其注册为默认程序对于您使用的文件类型,这意味着您可以完全跳过选择程序名称:

Process.Start(briefingFile);

【讨论】:

  • 正如我在最初的帖子中所说,我还尝试了 notepad++ 的完整路径:“c:\\program file (x86)\\notepad++\\notepad++.exe”。我注意到实际上记事本确实打开了,但它试图在我写的时候创建一个新文件,我尝试读取的这个文件确实存在,因为我可以用记事本打开它。
  • 抱歉,帖子不完整(我不小心提前提交了表格,在我完成添加该部分之前)。一定是撞了 shift+enter 什么的。
  • 我不明白你建议我对程序文件中的空间做什么?为什么这是相关的。只是为了尝试,我尝试指定“C:\ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ Accessories”下的记事本(链接)完整路径,注意“开始菜单”中的空间,它运行良好。
  • C:\ProgramC:\Program Files\... 的第一部分,您会看到该错误,因为某物未能说明该文件夹名称中的 。
  • 也许我需要以不同的方式为记事本指定输入文件?我在“程序文件”中的输入文件也是如此
【解决方案2】:

解决方法是在文本文件,不在应用程序中。 就我而言: 改变:

Process.Start(editor, briefingFile);

Process.Start(editor, $@"""{briefingFile}""");

“编辑器”是编辑器的完整路径。

【讨论】:

    【解决方案3】:

    您的代码没有任何问题,但正如 Joel 所说,使用 File.Exists() 有一些缺点。您只需要确保 Notepad++ 文件夹位于您的用户/系统环境 PATH 变量中。我在这台 PC 上添加了我的 Notepad++ 文件夹的路径,即 C:\Program Files\Notepad++\,并运行相同的代码,它在 Notepad++ 中打开文件就好了。

    我在一个空的 .NET 3.1 表单项目中运行了以下代码,它可以正常执行。您还在新项目中遇到错误吗?

            OpenFileDialog fileDialog= new OpenFileDialog();
            fileDialog.Filter = "All Files (*.*)|*.*";
            fileDialog.FilterIndex = 1;
            string editor = "";
            if (fialDialog.ShowDialog() == DialogResult.OK)
            {
                editor  = fileDialog.FileName;
            }
    
            //Added the escaped quotes to the front & back of this in case the path contains spaces.
            var filePath = @"""C:\SOMELOCALFILEPATH\test.txt""";
            if (File.Exists(filePath))
            {
                Process.Start(editor, filePath);
            }
    

    我设置了一个断点,当Process.Start 执行时我的editor 采用这种格式:"C:\\Program Files\\Notepad++\\notepad++.exe"

    【讨论】:

    • 谢谢。但是,我仍然想知道指定文本编辑器的完整路径来打开文件。在我的例子中,我让用户选择他喜欢的应用程序来打开文本文件并存储这个变量。我在想我可以指定完整路径,然后应用程序就会打开。这是否意味着我还必须将选定的应用程序添加到 PATH 变量中?我宁愿不更改用户路径。
    • 此外,我认为问题在于找不到记事本++。我注意到notepad++确实打开了,但它没有打开文本文件,而是尝试创建一个新文件。是的,文本文件退出,因为它在记事本中打开文件...
    • 那讲得通。您能否分享将这些字符串分配给editorbriefingFile 的代码部分?我以为我在某处看到您不需要直接引用路径,但是直接引用对我有用,所以我猜您分配这些变量的方式有问题吗?
    • 编辑器源自浏览按钮... 'var searchForFile = new OpenFileDialog(); searchForFile.Title = "选择默认文本编辑器"; var 结果 = searchForFile.ShowDialog(); ... selectedFile = searchForFile.FileName;'文件名的类型是@“path\path\filename” 不过,我认为问题出在应用程序上,在这种情况下,notepadd++ 是构建的,而不是我的代码。毕竟记事本没有文件名中的空格问题。 “程序文件...”只是文件。但是记事本++没有
    • 您可以开始一个全新的项目并将我更新答案的代码放入一个按钮中,看看它是否会给您带来错误?如果这导致您的机器出现错误,那么我将不知所措。
    【解决方案4】:

    我遇到了这个问题,当我尝试打开安装在C:\Program 文件 (x86)\MyProgram\SecondFolder\MyTxt.txt

    问题是当我从 Windows 资源管理器复制文件路径时,它删除了文件(x86).

    copy the file path

    File path pasted into Visual Studio

    您必须检查文件路径是否正确。否则它将无法正常工作。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多