【问题标题】:How can be pasted remotely a locally copied file in C#?如何在 C# 中远程粘贴本地复制的文件?
【发布时间】:2021-04-15 13:07:50
【问题描述】:

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

复制/粘贴远程工作没有任何问题,例如可以复制/粘贴简单的文本(不是文件!)或图片(在 Paint 中打开)(已通过 Free Clipboard Viewer 4.0 检查)。

一些附加信息:

  1. 本地复制的文件

剪贴板包含数据“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](或FileNameW)获取整个路径,并且可以将图片导入到我的应用程序中。

  1. 远程复制文件

数据格式未知(在 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))'

但是远程复制的文件:

  1. 可以粘贴到本地文件系统中,或者
  2. 可以粘贴,例如进入微软 Word 没有任何问题。这意味着,复制文件的内容可以在剪贴板上找到 - 但无法访问。很可能“FileContents”应该适合获取它。

你有什么想法吗?

非常感谢。

【问题讨论】:

    标签: c# exception clipboard remote-desktop


    【解决方案1】:

    这是我正在使用的:

    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;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多