首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中远程粘贴本地复制的文件?

如何在C#中远程粘贴本地复制的文件?
EN

Stack Overflow用户
提问于 2021-04-15 13:07:50
回答 1查看 286关注 0票数 0

使用< Ctrl > 复制了一个文件(来自文件资源管理器)。如果文件是图片(例如,JPG格式),则必须将文件的内容粘贴到RichTextBox中--类似于Microsoft。它已经实现,工作没有任何问题-但只在本地。如果复制的文件位于远程桌面计算机上,则无法工作。问题是:为什么?

复制/粘贴远程工作没有任何问题,例如一个简单的文本(不是一个文件!)也可以复制/粘贴图片(在画图中打开)(已由自由剪贴板查看器4.0检查)。

一些补充资料:

  1. 本地复制文件

剪贴板包含数据"DataFormats.FileDrop“。Clipboard.GetDataObject().GetFormats()提供以下字符串数组:

代码语言:javascript
运行
复制
[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获得整个路径,并将图片导入到我的应用程序中。

  1. 远程复制文件

数据的格式未知(在DataFormats类中找不到)。Clipboard.GetDataObject().GetFormats()提供以下字符串数组:

代码语言:javascript
运行
复制
[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)的异常)’

但是,远程复制的文件:

  1. 可以粘贴到本地文件系统中,或者
  2. 可以粘贴到Microsoft中,没有任何问题。这意味着可以在剪贴板上找到复制文件的内容,但不能访问。很可能"FileContents“应该适合得到它。

你有什么想法吗?

在此之前,非常感谢您。

EN

回答 1

Stack Overflow用户

发布于 2021-07-13 06:39:13

这就是我所用的:

代码语言:javascript
运行
复制
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)方法执行以下操作:

代码语言:javascript
运行
复制
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;
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67109086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档