【问题标题】:Cut files to clipboard in C#在 C# 中将文件剪切到剪贴板
【发布时间】:2010-01-16 16:04:49
【问题描述】:

我正在寻找一种以编程方式将文件剪切到剪贴板的方法,例如,对 C# 中的某个函数的调用与在 Windows Explorer 中选择一个文件并按下 Ctrl kbd> + X.

运行程序并在硬盘驱动器上的其他文件夹中按 Ctrl + V 后,原始文件将被移动 到新文件夹。通过查看 Stack Overflow 问题 Copy files to clipboard in C#,我知道复制工作很容易,但剪切工作似乎有所不同。我该怎么做?

【问题讨论】:

    标签: c# .net file clipboard


    【解决方案1】:

    请尝试以下,翻译自The Code Project文章Setting the Clipboard File DropList with DropEffect in VB.NET

    byte[] moveEffect = new byte[] {2, 0, 0, 0};
    MemoryStream dropEffect = new MemoryStream();
    dropEffect.Write(moveEffect, 0, moveEffect.Length);
    
    DataObject data = new DataObject();
    data.SetFileDropList(files);
    data.SetData("Preferred DropEffect", dropEffect);
    
    Clipboard.Clear();
    Clipboard.SetDataObject(data, true);
    

    【讨论】:

    • 谢谢,我尝试使用 Clipboard.SetFileDropList 并抛出异常,但您的方法很有效!
    • @DarkFalcon,感谢您提供的答案,这仍然有效 - 在 Win 10 中也得到了证实 :)
    【解决方案2】:

    为了看看会发生什么,我将MemoryStream 替换为DragDropEffects,如下所示:

    data.SetData("FileDrop", files);
    data.SetData("Preferred DropEffect", DragDropEffects.Move);
    

    显然,它是真正的剪辑而不是副本! (这是在 Windows 7 上 - 我没有尝试过其他操作系统)。不幸的是,它只是巧合地起作用。例如,

    data.SetData("Preferred DropEffect", DragDropEffects.Copy);
    

    不会产生副本(仍然是剪切)。似乎非空会导致剪切,空会导致副本。

    【讨论】:

    • 查看我的答案,它使用 DragDropEffects 枚举。
    【解决方案3】:

    我喜欢将这样的代码封装在一个有意义的 API 中。我也喜欢尽可能避免使用神奇的字节串。

    我想出了这个扩展方法,它有效地使用了DragDropEffects 枚举,解决了@Keith 在他的回答中面临的谜团。

    public static class Extensions
    {
        public static void PutFilesOnClipboard(this IEnumerable<FileSystemInfo> filesAndFolders, bool moveFilesOnPaste = false)
        {
            var dropEffect = moveFilesOnPaste ? DragDropEffects.Move : DragDropEffects.Copy;
    
            var droplist = new StringCollection();
            droplist.AddRange(filesAndFolders.Select(x=>x.FullName).ToArray());     
    
            var data = new DataObject();
            data.SetFileDropList(droplist);
            data.SetData("Preferred Dropeffect", new MemoryStream(BitConverter.GetBytes((int)dropEffect)));
            Clipboard.SetDataObject(data);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      相关资源
      最近更新 更多