FileDrop格式的奇怪剪贴板行为

时间:2011-07-27 09:29:28

标签: c# file clipboard

我在我的应用程序中面临一个非常奇怪的剪贴板行为。 我有一个Tcp服务器接收一些文件,将它们保存到临时位置并将它们放在剪贴板中。 这是代码的一部分:

filename = bReader.ReadString();
int dim = bReader.ReadInt32();
byte[] buffer = new byte[dim];
buffer = bReader.ReadBytes(dim);
using (FileStream fs = new FileStream(type, FileMode.OpenOrCreate, FileAccess.Write))
{
    fs.Write(buffer, 0, buffer.Length);
    fs.Close();
}                    
String path = Path.GetFullPath(filename);
DataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, true, new String[]{path});
Clipboard.SetDataObject(data, true);

我可以正确接收和保存文件,并将FileDrop数据放入剪贴板。 问题是我只能在我的应用程序关闭时粘贴文件。这真的很奇怪......

应用程序关闭后,我可以粘贴没有问题,粘贴的文件是完全正确的。

有什么建议吗? 提前致谢

2 个答案:

答案 0 :(得分:1)

可能发生,当您致电Clipboard.SetDataObject时,剪贴板是共享系统资源,它会调用user32 API函数OpenClipboard,这里的问题也许是因为您的程序打开它,所以其他应用程序在您的应用程序仍在运行时无法使用它。如果您在其上使用自定义元文件,这也可能是一个问题,请检查this。无论如何,我运行此代码“我正在使用4.0,如果重要”:

DataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, true, new String[] { @"C:\test.txt" });
Clipboard.SetDataObject(data, true);

但是我没有回顾你描述的问题,Windows可以在程序运行时和关闭后查看复制操作。您是否只能访问该代码中的Clipboard?你如何阅读“以表格粘贴”的数据?

答案 1 :(得分:0)

使用data.SetData(DataFormats.FileDrop,true,new String [] {@“ C:\ test.txt”});将无法正确设置剪贴板DataObject。小费!如果您讯问剪贴板,则必须将其重置。来自https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.clipboard.setfiledroplist?view=netframework-4.0

DataObject dataObj = new DataObject();
//Create and initializes a new StringCollection.
StringCollection strcolFileList = new StringCollection();
strcolFileList.AddRange(fileList);

try
{
dataObj.SetFileDropList(strcolFileList);
}
catch { }
dataObj.SetData(DataFormats.UnicodeText, Path.GetFullPath(strcolFileList[0]); ); //you can add this for fun
Clipboard.SetDataObject(dataObj);