为什么ParamStr显示错误的文件名?

1 delphi paramstr

我已将".file_5"扩展名与我的应用程序相关联,并使用Delphi中的ParamStr(1)函数显示一个消息框,其中包含使用下面的代码在资源管理器中双击它时文件的路径和文件名.

procedure TForm1.FormCreate(Sender: TObject);
 var
  TheFile : string;
begin
  TheFile := ParamStr(1);  //filename for the file that was loaded
  ShowMessage(TheFile);
end;
Run Code Online (Sandbox Code Playgroud)

这有效,但如果我将文件移动到另一个位置,然后将其移动到最初的位置,则显示的消息不正确.

示例:(使用test.file_5)

该文件的原始位置位于C:\驱动器中,当我双击它时,我的应用程序启动并显示一个消息框,其中显示:

C:\ test.file_5

这是对的.如果我将同一个文件移动到包含空格的目录(例如程序文件夹),则显示的Messagbox不是

C:\ Program Files\test.file_5

就像我期望的那样

C:\ PROGRA〜1.FILE_

这显然不是我追求的信息所以我的问题是如何使用ParamStr()函数来考虑其中包含空格的目录,或者是否有一个更好的函数,我应该使用它与包含空格的目录一起使用他们.

jac*_*ate 15

这不是必然的错误......只是资源管理器将短文件名传递给您的程序 - 而不是长文件名 - .查看短名称和长名称.

您可以使用这两个名称打开文件,或者如果您只关心使用长文件名,则可以在ShowMessage(或实际操作文件)之前从短文件名转换为长文件名.使用Windows.pas中定义的GetLongPathName API调用.

function ShortToLongFileName(const ShortName: string): string;
var
  outs: array[0..MAX_PATH] of char;
begin
  GetLongPathName(PChar(ShortName), OutS, MAX_PATH);
  Result := OutS;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  TheFile : string;
begin
  TheFile := ParamStr(1);  //filename for the file that was loaded
  TheFile := ShortToLongFileName(TheFile);
  ShowMessage(TheFile);
end;
Run Code Online (Sandbox Code Playgroud)

我在Windows Vista下测试它,GetLongPathName无论你提供短文件名还是已经很长的文件名(如果文件存在,很明显)


Ken*_*ite 7

您的关联设置错误.而不是双击.file_5做

C:\YourPath\YourApp.exe %1
Run Code Online (Sandbox Code Playgroud)

该关联应该设置为

"C:\YourPathYourApp.exe" "%1"
Run Code Online (Sandbox Code Playgroud)

注意%1周围的双引号 - 这会保留包含的任何空格而不是它们导致Windows传递短路径和文件名.