【问题标题】:c# How to detect and process a .URL file type on DragDrop eventc# 如何在 DragDrop 事件中检测和处理 .URL 文件类型
【发布时间】:2015-11-21 09:17:15
【问题描述】:

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

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

基本上,首先,我希望代码能够识别文件是“.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 事件的第一行)

我的问题是:如何更正或修改代码(在任何程度上,即使完全改变代码),以便它可以识别.url 扩展名,然后继续将其视为普通文件。

另外,为什么在执行第一行之后代码的执行立即停止,即使已经为第一行之后的几行设置了断点(如完全跳过 if 语句)?

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

e.Effect = DragDropEffects.Link;

当文件只有 Internet 快捷方式类型“.url”时在 DragEnter 事件处理程序中工作,还是不可能?

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

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

【问题讨论】:

    标签: c# winforms visual-studio-2010 .net-4.0 drag-and-drop


    【解决方案1】:

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

    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;
    }
    

    【讨论】:

      【解决方案2】:

      更新:@taffer's answer 解释了为什么您的代码行为异常。

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

          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 进行验证。

      【讨论】:

      • 这个,稍加修改,对我来说完全没问题! :) 我实际上让文本框检测两个不同的东西,因此,使用您的代码,它现在可以检测它是直接来自浏览器还是来自现有的快捷方式。然后它会让 DragDrop 知道该做什么。再次感谢,也感谢回答我的所有三个问题! :)(我现在只是研究制表符分隔以便能够保存数据)
      • 我也很高兴,我也希望您的回答以及 taffer 可以为面临相同问题的其他人提供更多见解,并且不像 DragDrop 领域的你们那样知识渊博:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多