大家以前有没有遇到这样的问题,就是通过命令行参数去传文件名及路径时,有时得到的值是例如:"C:\PROGRA~1\测试~1.txt"这样的简写,实际上它的全路径应是"C:\Program Files\测试程序.txt".VB的Command值同样会出现这样的问题,但在VB中,如果使用Dir(FileName),至少可以得到正确的文件名,比如"测试程序.txt",那么在Delphi中,如果传过来的FileName如上面所举的例子一样,应该怎样解决呢?
调试欢乐多
FilePath=Command '接受命令行参数
Filename=dir(FilePath)
msgbox FileName
*********************OK,显示"你好.txt"
可惜Delphi的extractFileName函数不具备此功能,它会显示"你~1.txt"
所以,我想知道在Delphi中怎样才能正确的解析出规范的路径或文件名
var
vSHFileInfo: TSHFileInfo;
begin
Result := '';
mFileName := ExcludeTrailingPathDelimiter(mFileName);
if not FileExists(mFileName) and not DirectoryExists(mFileName) then Exit; FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
while SHGetFileInfo(PChar(mFileName), 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_DISPLAYNAME) <> 0 do begin
Result := string(vSHFileInfo.szDisplayName) + '\' + Result;
mFileName := ExtractFilePath(ExcludeTrailingPathDelimiter(mFileName));
if mFileName = '' then begin
Result := '';
Break;
end;
if mFileName = ExtractFileDrive(mFileName) + '\' then begin
Result := ExcludeTrailingPathDelimiter(mFileName + Result);
Break;
end;
end;
end; { ExtractLongPathName }procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := ExtractLongPathName(ExtractShortPathName('C:\Program Files\Borland\Delphi6\Bin\delphi32.exe'));
end;
不过函数比较复杂,不知有没有更简洁的函数.中午12:00结贴.
这个问题与你的系统环境有关,应该不是DELPHI的问题,系统如此,取出来当然如此
目前还没找到更好的方法来实现~~
并且还存在一个bug,当用户隐藏已知的文件扩展名时,这里也将隐藏~~//矫正如下~~
function ExtractLongPathName(mFileName: TFileName): TFileName;
var
vSHFileInfo: TSHFileInfo;
vFileExt: string;
begin
Result := '';
mFileName := ExcludeTrailingPathDelimiter(mFileName);
if not FileExists(mFileName) and not DirectoryExists(mFileName) then Exit;
vFileExt := ExtractFileExt(mFileName); FillChar(vSHFileInfo, SizeOf(vSHFileInfo), 0);
while SHGetFileInfo(PChar(mFileName), 0, vSHFileInfo, SizeOf(vSHFileInfo),
SHGFI_DISPLAYNAME) <> 0 do begin
Result := string(vSHFileInfo.szDisplayName) + '\' + Result;
mFileName := ExtractFilePath(ExcludeTrailingPathDelimiter(mFileName));
if mFileName = '' then begin
Result := '';
Break;
end;
if mFileName = ExtractFileDrive(mFileName) + '\' then begin
Result := ExcludeTrailingPathDelimiter(mFileName + Result);
if ExtractFileExt(Result) <> vFileExt then
Result := ChangeFileExt(Result, vFileExt);
Break;
end;
end;
end; { ExtractLongPathName }//继续寻找更好的解决方法~~
To cow8063:
确实不是Delphi的问题,我说过命令行参数是这样传的,这和操作系统有关系。只是我们不能这样和用户解释,我们必须纠正为规范的命名和路徑。