我有一个拥有TreeView的WinForms应用程序。用户可以将文件从WindowsExplorer拖到TreeView,然后他们可以将文件拖回到WindowsExplorer中,这会影响将文件复制到文件被删除的位置。我想要做的是,如果文件已经存在于删除文件的目录中,我想提前重命名要复制的文件/文件夹,这样就不会发生冲突。
以下是我将文件复制到WindowsExplorer的方法。在treeView的ItemDrag上,我遍历所选节点的节点,然后将其打包到一个数组中。然后,我使用这段代码:
var dataObject = new DataObject(DataFormats.FileDrop, files.ToArray());
dataObject.SetData(DataFormats.StringFormat, dataObject);
DoDragDrop(dataObject, DragDropEffects.Copy);
这很好用,但是一旦它发送到Windows资源管理器,它就不在我手中了。如何找出文件被复制到的时间和位置,并拦截进行更改的文件?这可能吗?
答案 0 :(得分:1)
Explorer Drag & Drop是一篇很棒的文章,可以帮助您实现目标。
EDIT2:似乎CodeProject上有一个C++ article可用。但我无法找到使用C#的方法。
答案 1 :(得分:0)
AFAIK,无法知道丢弃目标(在您的情况下是目标文件夹)。您可以查看CFSTR_FILENAMEMAP shell剪贴板格式,但在这种情况下,您只能在drag-n-drop之前(或正在处理)提供名称映射。
另请注意,.net中的默认DataObject具有有限的shell支持。因此,如果您需要使用上面提到的格式,您需要编写自己的IDataObject实现(或者使用某人的实现,可以找到有关批量shell drag-n-drop相关内容的好例子here)
答案 2 :(得分:0)
不是将文件名放入数据对象,而是创建一个具有唯一/易于区分名称的临时文件,并将该文件名放入数据对象的下拉列表中(该文件可能为空或包含您可能需要的某些信息) 。使用FileSystemWatcher(观察整个驱动器)来检测丢弃(将过滤器设置为临时文件名,将IncludeSubDirectories设置为true,并将Path设置为要监视的驱动器的根目录。)启动DoDragDrop。一旦删除了唯一/易于区分的文件,FileSystemWatcher就可以告诉你删除它的位置,你可以做任何你需要做的事情(例如删除丢弃的临时文件并替换你原本想要丢弃的文件。这是一个很远的文件。 - 从完美的解决方案,但可能会有所帮助。更好的是,它可能会让某人想出一个更好的解决方案!)
一个缺点是你并不知道有人可能会丢弃文件的驱动器,你可能需要为多个驱动器设置一个观察程序。如果你错过了一个驱动器(或网络路径),那么问题.....!请记住丢弃后处理观察者。
必须有更好的方法。例如从zip文件夹中拖动文件时请考虑。该文件仅在删除后提取。
答案 3 :(得分:-1)
我认为不可能。