【问题标题】:How to copy a folder/directory to clipboard using c#如何使用 C# 将文件夹/目录复制到剪贴板
【发布时间】:2012-10-29 08:09:29
【问题描述】:

我正在创建一个基于 C# windows 的应用程序,它基本上是一个 windows 资源管理器模式。用于将文件夹从一个地方复制和粘贴到另一个地方。一切正常。在我的应用程序中,我有两个窗口,每个窗口都有一个树视图。第一个是显示要复制的文件位置的树形视图,第二个是要粘贴文件的树形视图。

使用以下代码一切正常。我在哪里获得要复制的所有文件。所有这些文件都被复制到剪贴板。

string[] files = Directory.GetFiles(txtPath.Text.ToString(), "*.*", SearchOption.TopDirectoryOnly);
//also tried using SearchOption.AllDirectories
if (files != null)
{
     IDataObject data = new DataObject(DataFormats.FileDrop, files);
     MemoryStream memo = new MemoryStream(4);
     byte[] bytes = new byte[] { (byte)(copy_cut ? 2 : 5), 0, 0, 0 };
     memo.Write(bytes, 0, bytes.Length);
     data.SetData("Preferred DropEffect", memo);
     Clipboard.SetDataObject(data);
}

并使用以下代码粘贴到相应的文件夹中

IDataObject data = Clipboard.GetDataObject();
if (!data.GetDataPresent(DataFormats.FileDrop))
     return;

     string[] files = (string[])data.GetData(DataFormats.FileDrop);
     MemoryStream stream = (MemoryStream)data.GetData("Preferred DropEffect", true);
     int flag = stream.ReadByte();
     if (flag != 2 && flag != 5)
         return;
     bool cut = (flag == 2);
     foreach (string file in files)
     {
         string dest = "C:" + "\\" + System.IO.Path.GetFileName(file);
         try
         {
             if (cut)
                File.Move(file, dest);
             else
                File.Copy(file, dest, false);
         }
         catch (IOException ex)
         {

         }
      }

对我来说一切都很好。复制和粘贴都很好。但仅适用于没有任何子文件夹的文件夹。

如果我碰巧在一个文件夹中有很多文件夹,并且每个文件夹都有很多文件。那么上面的代码就不能正常工作了。

例如。

如果文件夹 A 有子文件夹 X、Y、Z 并且每个子文件夹 X、Y、Z 有很多文件,当我复制到剪贴板并粘贴到所需位置时,我只会得到文件夹 X 的内容/文件, Y,Z 而不是文件夹 X,Y,Z 本身。

有没有一种方法可以将文件夹 X、Y、Z 复制到剪贴板并粘贴它们。就像我们在 PC 中进行的简单复制和粘贴一样,将整个文件夹及其子文件夹粘贴到所需位置。

非常感谢与此问题相关的帮助。

谢谢,

维克内斯瓦尔

【问题讨论】:

  • 你为什么只处理文件而不是路径?
  • 顺便说一句。如果您使用 Stream 类(任何类型)将其包装在 using 子句中。
  • @KamilLach:我没有使用任何流类。以上几行是我主要使用的代码。正如我所说,我必须复制所有文件和文件夹并将它们粘贴到不同的位置。
  • 您的代码只处理文件,而不是文件和文件夹,因此您只能复制文件。
  • @Ramhound:我找不到任何其他方法来做到这一点。我也尝试使用 File.Create() 方法。但一切都是徒劳的。

标签: c# windows windows-explorer


【解决方案1】:

如果你想复制并保持相同的结构不变,你必须创建一个递归函数。

Msdn 有一个例子,你可以找到here

【讨论】:

  • 正如我所说,我正在尝试创建 Windows 资源管理器类型的程序。所以剪贴板很适合实现任何复制或粘贴选项。我认为复制剪贴板中的所有文件和文件夹并再次粘贴是个好主意。
  • 您应该只将基本 url 复制到剪贴板。在粘贴时,您应该进行递归复制。
  • 我不明白递归复制是什么意思。?我还在尝试。顺便说一句,您提供的链接工作正常。但我想看看是否可以通过使用剪贴板来实现相同的目标。这是我最大的担忧。
  • 我也在考虑如果用户按下 Ctrl+v 会怎样。那时只会复制文件而不是文件夹。任何建议都会非常有帮助。我已经花了 4 个小时来找到那个单一的解决方案。提前致谢。以及您提供的链接。
  • 我没有完全关注你。用户是否在您的程序中选择了根文件夹,您是否希望用户能够将此选择粘贴到资源管理器中?
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2017-10-05
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多