在Delphi中检查文件扩展名是否有效。

3

我有一个TEditbox,用户在其中输入文件名和所需的扩展名。现在我想验证他输入的扩展名是否是已注册到Windows中的有效扩展名。我该如何实现?

我所拥有的仅有:

procedure TForm2.OkBtnClick(Sender: TObject);
var
ExtractedFileExt: string;
begin
  ExtractedFileExt := ExtractFileExt(cxCbxSelectedFile.Text);
end;

我该如何使用该字符串变量并检查它是否是在Windows中注册的有效文件扩展名?


2
嗯,你可以尝试遍历 HKEY_CLASSES_ROOT 并检查扩展名是否与其中任何 .xyz 键匹配。 - Thorsten Dittmar
2
@Thorston 你可以这样做,但使用API而不是黑客攻击注册表不是更好吗? - David Heffernan
1
@HelloMan 这是我们经常遇到的情况。提问者希望我们为他们编写代码。然后他们拿走了代码,却不理解它,如果代码不能按照他们的期望运行,就会抱怨。由于他们从一开始就没有理解代码,所以他们陷入了困境。实际上,你应该努力学习。阅读文档。在网上寻找各种示例。自己翻译它们。探索你编写的代码。测试它。用不同形式的扩展来测试它,并确保它按照你的期望运行。简而言之,寻求学习和理解,而不是代码。 - David Heffernan
1
可能是使用Windows API获取文件关联的重复问题。 - fantaghirocco
1
这似乎并不是非常有建设性的。 - David Heffernan
显示剩余13条评论
1个回答

1
我认为这并不是“黑客攻击”注册表的行为。据我所知,如果您想要在不读取注册表中的任何值的情况下完成您想要做的事情,没有好的方法可用。 因此,如果您想使用注册表,请使用以下代码:
uses Registry;

function GetProgramAssociation(const Ext: string): string;
var reg: TRegistry;
    s: string;
begin
  s:='';
  reg:=TRegistry.Create;
  try
    reg.RootKey:=HKEY_CLASSES_ROOT;
    if reg.OpenKey('.'+ext+'shellopencommand', false) then
    begin
      s:=reg.ReadString('');
      reg.CloseKey;
    end
    else
    begin
      if reg.OpenKey('.'+ext, false) then
      begin
        s:=reg.ReadString('');
        reg.CloseKey;
        if s='' then
        begin
          if reg.OpenKey(s+'shellopencommand', false) then
            s:=reg.ReadString('');
          reg.CloseKey;
        end;
      end;
    end;
    if Pos('%', s) > 0 then Delete(s, Pos('%', s), length(s));
    if ((length(s)>0) and (s[1]='"')) then Delete (s, 1, 1);
    if ((length(s)>0) and (s[length(s)]='"')) then Delete(s, Length(s), 1);
    while ((length(s)>0) and ((s[length(s)]=#32) or (s[length(s)]='"'))) do
      Delete(s, Length(s), 1);
    result:=s;
  finally
  reg.Free;
  end;
end;

然后:

if GetProgramAssociation(Extension) = '' then
  ShowMessage('Nope!');

它运行良好。 如果扩展名没有与有效程序相关联,则返回空字符串。 例如,如果输入“doc”(不带“.”),则返回Word.Document.8;如果输入“abcdef”,则返回空字符串('')。
请记住:输入扩展名时不要加点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接