【问题标题】:How do I open a file with the default text editor?如何使用默认文本编辑器打开文件?
【发布时间】:2013-06-05 13:37:54
【问题描述】:

我想打开一个 *.conf 文件。我想用标准的 Windows 编辑器(例如 notepad.exe)打开这个文件。

我目前有这个 ShellExecute 代码:

var
  sPath, conf: String;
begin
  try
  sPath := GetCurrentDir + '\conf\';
  conf := 'nginx.conf';
ShellExecute(Application.Handle, 'open', PChar(conf), '', Pchar(sPath+conf), SW_SHOW);
  except
    ShowMessage('Invalid config path.');
  end;
end; 

但是什么也没发生。那么我应该改变什么?

【问题讨论】:

    标签: delphi configuration-files shellexecute


    【解决方案1】:

    如何使用默认文本编辑器打开文件?

    您需要使用ShellExecuteEx 并使用SHELLEXECUTEINFOlpClass 成员来指定您要将文件视为文本文件。像这样:

    procedure OpenAsTextFile(const FileName: string);
    var
      sei: TShellExecuteInfo;
    begin
      ZeroMemory(@sei, SizeOf(sei));
      sei.cbSize := SizeOf(sei);
      sei.fMask := SEE_MASK_CLASSNAME;
      sei.lpFile := PChar(FileName);
      sei.lpClass := '.txt';
      sei.nShow := SW_SHOWNORMAL;
      ShellExecuteEx(@sei);
    end;
    

    将文件的完整路径传递为FileName

    【讨论】:

    • 我可能会将类名设置为.txt,因为txtfile 不能保证是所有系统上文本文件的注册程序。有些应用确实会改变它。
    • @RemyLebeau 谢谢你。我承认对 shell 的类名知之甚少,并尊重您的经验和知识。
    • 实际上,我以前从未需要将类名与ShellExecuteEx() 一起使用。我只是评论了文档所说的内容(类名可以是文件扩展名或 progid)以及我对文件扩展名 progid 的一般工作方式的了解。
    【解决方案2】:

    主要问题是您使用nginx.conf 作为文件名。您需要完全限定的文件名(带有驱动器和目录)。如果该文件与您的 EXE 位于同一目录中,您应该这样做

    ShellExecute(Handle, nil,
      PChar(ExtractFilePath(Application.ExeName) + 'nginx.conf'),
      nil, nil, SW_SHOWNORMAL)
    

    目录无需设置,正常使用SW_SHOWNORMAL即可。

    此外,这仅在运行应用程序的系统为.conf 文件正确设置文件关联时才有效。如果运行应用程序的系统使用 MS Paint 打开.conf 文件,则上面的行将启动 MS Paint。如果根本没有关联,则该行将不起作用。

    您可以手动指定使用notepad.exe

    ShellExecute(Handle, nil, PChar('notepad.exe'),
      PChar(ExtractFilePath(Application.ExeName) + 'nginx.conf'),
      nil, SW_SHOWNORMAL)
    

    现在我们开始 notepad.exe 并将文件名作为第一个参数传递。

    第三,你不应该像现在这样使用try..exceptShellExecute 可能由于“无效配置路径”以外的其他原因而失败,并且在任何情况下,它都不会引发异常。相反,考虑

    if FileExists(...) then
      ShellExecute(...)
    else
      MessageBox(Handle, 'Invalid path to configuration file', 'Error', MB_ICONERROR)
    

    现在,回到主要问题。我的第一个代码 sn-p 仅在运行您的应用程序的系统恰好具有.conf 文件的适当文件关联帖子时才有效,而第二个代码将始终打开记事本。更好的选择可能是使用用于打开.txt 文件的应用程序。大卫的回答举了一个例子。

    【讨论】:

    • +1 我没有发现文件名错误,并认为关联是问题所在。我会留下我的答案,因为它显示了如何确保 .conf 文件被视为文本文件。
    • ShellExecute 是一个 Windows API 调用,在任何情况下都不会引发 Delphi 异常。返回值 表示错误
    • 事实上,ShellExecute 的错误处理相当无望。如果你想要真正的错误检查,你需要使用ShellExecuteEx
    • @Polymorphin 在没有.conf 关联的机器上(例如我现在使用的机器),这里的第一个代码示例将不起作用。第二个示例将记事本强加给用户,我讨厌这样。我从来没有见过记事本,因为那不是我的默认文本编辑器。您肯定想要做的是使用用户首选的文本文件编辑器打开文本文件。
    【解决方案3】:

    使用

    ShellExecute(0, 'Open', PChar(AFile), nil, '', 1{SW_SHOWNORMAL});
    

    在Delphi DX10中定义了这个函数

    Winapi.ShellAPI

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2020-06-25
      • 2013-02-28
      • 2012-11-17
      相关资源
      最近更新 更多