使用< Ctrl > 复制了一个文件(来自文件资源管理器)。如果文件是图片(例如,JPG格式),则必须将文件的内容粘贴到RichTextBox中--类似于Microsoft。它已经实现,工作没有任何问题-但只在本地。如果复制的文件位于远程桌面计算机上,则无法工作。问题是:为什么?
复制/粘贴远程工作没有任何问题,例如一个简单的文本(不是一个文件!)也可以复制/粘贴图片(在画图中打开)(已由自由剪贴板查看器4.0检查)。
一些补充资料:
剪贴板包含数据"DataFormats.FileDrop“。Clipboard.GetDataObject().GetFormats()提供以下字符串数组:
[0] "Shell IDList Array"
[1] "DataObjectAttributes"
[2] "DataObjectAttributesRequiringElevation"
[3] "Shell Object Offsets"
[4] "Preferred DropEffect"
[5] "AsyncFlag"
[6] "FileDrop"
[7] "FileNameW"
[8] "FileName"
[9] "FileContents"
[10] "FileGroupDescriptorW"
可以使用Clipboard.GetFileDropList()0获得整个路径,并将图片导入到我的应用程序中。
数据的格式未知(在DataFormats类中找不到)。Clipboard.GetDataObject().GetFormats()提供以下字符串数组:
[0] "FileGroupDescriptorW"
[1] "FileContents"
[2] "Preferred DropEffect"
[3] "CanIncludeInClipboardHistory"
[4] "CanUploadToCloudClipboard"
使用"FileGroupDescriptorW“可以获得文件的名称(没有路径)。只有文件名,没有任何路径信息(很可能是本地有效的路径信息无法远程理解)。
Clipboard.GetData("FileContents")抛出一个异常: System.Runtime.InteropServices.COMException:‘剪贴板上的数据无效(来自HRESULT: 0x800401D3 (CLIPBRD_E_BAD_DATA)的异常)’
但是,远程复制的文件:
你有什么想法吗?
在此之前,非常感谢您。
发布于 2021-07-13 06:39:13
这就是我所用的:
string lTempPath = "Insert some path here";
Stream lStream = null;
MemoryStream lMemoryStream = null;
try
{
lStream = (Stream)Clipboard.GetData("FILEGROUPDESCRIPTORW"); //FileGroupDescriptorW
if (lStream == null)
lStream = (Stream)Clipboard.GetData("FILEGROUPDESCRIPTORA"); //FileGroupDescriptorA
if (lStream != null)
{
string[] lFileNames = ReadFilenamesFromStream(lStream);
if (lFileNames != null)
{
lMemoryStream = (MemoryStream)Clipboard.GetData("FileContents");
if (lMemoryStream == null)
lMemoryStream = (MemoryStream)Clipboard.GetData("CFSTR_FILECONTENTS");
if (lMemoryStream != null)
{
var lFileExtension = Path.GetExtension(lFileNames[0]);
var lFileName = lFileNames[0];
lFileNames = null;
if (lMemoryStream != null)
{
lMemoryStream.Position = 0;
//save at temp path
using (FileStream lFileStream = new FileStream(lTempPath, FileMode.Create))
{
lMemoryStream.WriteTo(lFileStream);
}
return new string[1] { lTempPath };
}
}
}
}
}
}
ReadFilenamesFromStream(lStream)方法执行以下操作:
try
{
using (BinaryReader lReader = new BinaryReader(aStream))
{
var count = lReader.ReadUInt32();
var lFileNames = new string[count];
while (count > 0)
{
//Flags
var Flags = lReader.ReadUInt32();
//ClassID
var ClassId = new Guid(lReader.ReadBytes(16));
//Size
var Size = new Size(lReader.ReadInt32(), lReader.ReadInt32());
//Point
var Point = new Point(lReader.ReadInt32(), lReader.ReadInt32());
//FileAttributes
var FileAttributes = (FileAttributes)lReader.ReadUInt32();
//CreationTime
var CreationTime = new DateTime(1601, 1, 1).AddTicks(lReader.ReadInt64());
//LastAccessTime
var LastAccessTime = new DateTime(1601, 1, 1).AddTicks(lReader.ReadInt64());
//LastWriteTime
var LastWriteTime = new DateTime(1601, 1, 1).AddTicks(lReader.ReadInt64());
//FileSize
var FileSize = lReader.ReadInt64();
//FileName
byte[] nameBytes = lReader.ReadBytes(520);
int i = 0;
while (i < nameBytes.Length)
{
if (nameBytes[i] == 0 && nameBytes[i + 1] == 0)
break;
i++; //yes, increase two times
i++;
}
string FileName = UnicodeEncoding.Unicode.GetString(nameBytes, 0, i);
lFileNames[lFileNames.Length - count] = FileName;
count--;
}
return lFileNames;
}
}
https://stackoverflow.com/questions/67109086
复制相似问题