使用剪切或复制将文件从剪贴板粘贴

7

.NET Clipboard类具有将文件放入剪贴板并定义它们是应该被移动还是复制(剪切/复制)的方法。

但是,如果我想要粘贴已经复制到剪贴板中的文件,我看不到使用标准剪贴板方法找出该文件是剪切还是复制的任何方法。


你不应该知道,这是特定于将对象放置在剪贴板上的应用程序的操作。这样的应用程序可能会在剪贴板上放置额外的数据,因此当它是相同的应用程序粘贴时,它可以执行一些额外的操作,但这完全取决于实现。资源管理器可能是最著名的例子,它直到文件实际被粘贴才进行剪切。否则这种情况并不常见。 - Hans Passant
@HansPassant “它只有在文件实际被粘贴后才会剪切” 你能详细解释一下吗?我不确定我是否正确理解了你的意思,但在下面的代码中,当使用资源管理器剪切文件时(至少在Win10上),aMove为真。我误解了吗? - 41686d6564 stands w. Palestine
1
只需自己尝试一下,在资源管理器中选择一个文件,然后按Ctrl+X。它不会消失。在您导航到其他地方并按Ctrl+V之前,什么也不会发生。这种行为是明智的,当您忘记粘贴时,您不希望文件消失,但它是特定于资源管理器的。与记事本等软件进行比较。 - Hans Passant
1个回答

8

信息存储在名为“Preferred DropEffect”的剪贴板数据对象中。 一个包含4字节数组的内存流包含枚举值System.Windows.DragDropEffects

public static void PasteFilesFromClipboard(string aTargetFolder)
{
    var aFileDropList = Clipboard.GetFileDropList();
    if (aFileDropList == null || aFileDropList.Count == 0) return;

    bool aMove = false;

    var aDataDropEffect = Clipboard.GetData("Preferred DropEffect");
    if (aDataDropEffect != null)
    {
            MemoryStream aDropEffect = (MemoryStream)aDataDropEffect;
            byte[] aMoveEffect = new byte[4];
            aDropEffect.Read(aMoveEffect, 0, aMoveEffect.Length);
            var aDragDropEffects = (DragDropEffects)BitConverter.ToInt32(aMoveEffect, 0);
            aMove = aDragDropEffects.HasFlag(DragDropEffects.Move);
    }

    foreach (string aFileName in aFileDropList)
    {
        if (aMove) { } // Move File ...
        else { } // Copy File ...
    }
}

[Flags]
public enum DragDropEffects
{
    Scroll = int.MinValue,
    All = -2147483645,
    None = 0,
    Copy = 1,
    Move = 2,
    Link = 4
}

1
我更喜欢使用 var effect = (DragDropEffects)BitConverter.ToInt32(moveEffect, 0); 这种写法。 - René Vogt
1
实际上,它并没有存储在“第一个字节”中。它以小端32位整数的形式存储。Scroll标志不会出现在第一个字节中。还要注意,它在技术上是一个标志枚举,这意味着您应该检查第二个_位_,而不是整个值。 - Nyerguds
谢谢你们两位,我已经按照René Vogt的建议修改了我的代码。 - Lumo

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