c# 如何在 DragDrop 事件中检测和处理 .URL 文件类型

c# How to detect and process a .URL file type on DragDrop event

我做了很多研究,但到目前为止还没有结果...

我找到的唯一与我的情况有些相似的链接甚至都不起作用:

基本上,首先,我希望代码能够识别该文件是“.url" 扩展名,或者更确切地说,一种互联网快捷方式,最常被 Google Chrome 以及 Mozilla Firefox 使用,而且很可能是我没有广泛测试的所有其他网络浏览器。

如果您不知道我指的是什么类型的快捷方式,我指的是下图中的快捷方式。

下面是我在文本框的 DragDrop 事件处理程序中使用的当前代码,它似乎不起作用:

string file = (string)(e.Data.GetData(DataFormats.FileDrop, false));
if (Path.GetExtension(file) == ".url")
{
     //Do Stuff Here
}

显然,代码甚至无法获取快捷方式的假定文件名。这个快捷方式是已经从浏览器拖放到桌面的那种。因此,在这种情况下,该快捷方式是被拖放以供代码处理的快捷方式。

(不确定这是否会有所不同,但我尝试将“DataFormats.FileDrop”替换为“DataFormats.Serialization”以及“DataFormats.Html”,没有正效应。)

此外,由于某些奇怪的原因,程序在上面代码块的第一行立即中断。 (它也恰好是我的 DragDrop 事件中的第一行)

我的问题是:如何更正或修改代码(在任何程度上,即使完全更改代码),使其能够识别[的互联网快捷方式文件=49=].url 扩展名,然后继续将其视为普通文件。

还有,为什么第一行之后的代码已经设置了断点(如完全跳过 if 语句)?

如果不是太多,如何只让下面一行:

e.Effect = DragDropEffects.Link;

在 DragEnter 事件处理程序中,当文件仅为 Internet 快捷方式类型“.url”时有效,或者这是不可能的?

我知道Notepad++可以打开和读取内容,甚至可以编辑互联网快捷方式文件。虽然如果我能获得识别快捷方式的代码,我想我将能够像普通文件一样从中读取它。

如果可能的话,我更希望有工作代码的答案。很抱歉这个问题很长,因为我想尽可能准确地回答我的问题。

更新: 解释了为什么您的代码行为异常。

你可以使用下面的代码,我已经测试过了;项目的行为与您描述的一样。

    private void textBox1_DragDrop(object sender, DragEventArgs e)
    {
        string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
        {
            if (Path.GetExtension(file[0]) == ".url")
            {
                //Do Stuff Here
                //
            }
        }
    }

    private void textBox1_DragEnter(object sender, DragEventArgs e)
    {
        string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);

        if (Path.GetExtension(file[0]) == ".url")
        {
            e.Effect = DragDropEffects.Link;
            //Do Stuff Here
        }

    }

第二个问题旁注:可能抛出异常,使用try catch验证。

首先,DataFormats.FileDrop returns一个字符串数组而不是一个简单的字符串(因为可以同时拖动多个文件):

string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (files != null && files.Length > 0 && Path.GetExtension(files[0]) == ".url")
{
    //Do Stuff Here
}

以及效果:拖动时会影响光标图标。您应该将其设置为 DragEnter/Over 并检查 DragDrop。如果您将其设置为 None,则无法删除该项目。

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
    string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
    if (files == null || files.Length == 0)
        e.Effect = DragDropEffects.None;
    else
        e.Effect = Path.GetExtension(files[0]) == ".url"
            ? DragDropEffects.Link
            : DragDropEffects.Copy;
}