3

我想打开一个 *.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; 

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

4

3 回答 3

8

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

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

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.

于 2013-06-05T13:48:24.730 回答
3

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

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

无需设置目录,一般应使用SW_SHOWNORMAL.

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

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

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

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

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

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

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

于 2013-06-05T13:50:10.937 回答
0

利用

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

在 Delphi DX10 中定义了这个函数

Winapi.ShellAPI

于 2019-03-16T17:50:47.983 回答