C# 如何从Drag';n未保存在磁盘上的已删除文件

C# 如何从Drag';n未保存在磁盘上的已删除文件,c#,xml,winforms,C#,Xml,Winforms,如何读取未保存在磁盘上任何位置的xml文件的xml内容 我希望能够从Outlook中拖动附件(文件扩展名是自定义的),然后将其放到我的应用程序中。根据xml文件的内容,我将相应地执行一些操作 我试图遍历e.Data.GetFormats()和GetData(format),但没有成功。 我试过e.Data.GetData(“FileContents”)没用。 我尝试了e.Data.GetData(DataFormat.Text)以及DataFormats.UnicodeText,DataForm

如何读取未保存在磁盘上任何位置的xml文件的xml内容

我希望能够从Outlook中拖动附件(文件扩展名是自定义的),然后将其放到我的应用程序中。根据xml文件的内容,我将相应地执行一些操作

我试图遍历
e.Data.GetFormats()
GetData(format)
,但没有成功。 我试过
e.Data.GetData(“FileContents”)
没用。 我尝试了
e.Data.GetData(DataFormat.Text)
以及
DataFormats.UnicodeText
DataFormats.FileDrop
,但没有任何效果

DataObject
读取文件内容很重要,因为我不想在拖动文件之前强迫用户保存文件

任何帮助都将不胜感激

答复 为有相同问题的人提供格式良好的答案:

因此,保存在磁盘上的任何文件都将具有可加载和读取的完整路径

从Outlook中删除的任何文件都将使用“FileGroupDescriptor”来获取文件名及其扩展名。“文件内容”将包含内容的数据流

例如:

处理拖放的文件,查看是否可以执行某些操作

public void DragEnter(DragEventArgs e)
{
    var obj = e.Data as DataObject;

    //get fileName of file saved on disk
    var fileNames = obj.GetFileDropList();
    
    if(fileNames.Count > 0)
        fileName = fileNames[0]; //I want only one at a time

    //Get fileName not save on disk
    if (string.IsNullOrEmpty(fileName) && obj.GetDataPresent("FileGroupDescriptor"))
    {
        var ms = (MemoryStream)obj.GetData("FileGroupDescriptor");
        ms.Position = 76;
        char a;
        while ((a = (char)ms.ReadByte()) != 0)
            fileName += a;
    }

    if (fileName.Length != 0)
    {
        var extension = fileName.Substring(fileName.LastIndexOf('.') + 1);
        switch (extension.ToUpper())
        {
            case "WTV":
                itemType = DropItemType.WTVFile;
                break;
          
            default:
                itemType = DropItemType.None;
                break;

        }
        canHandleDropData = (itemType != DropItemType.None);
    }
    
    if (canHandleDropData)
        e.Effect = DragDropEffects.Copy;
}
获取拖放文件的内容

 public XmlDocument GetXmlDocument(DragEventArgs dragEventArgs)
    {
        var doc = new XmlDocument();

        //Get content of outlook file not saved on disk
        var rawContent = dragEventArgs.Data.GetData("FileContents");

        if (rawContent == null)
        {
           //if null then it is a saved file and I can read its content by loading file name
            var xmlString = File.ReadAllText(fileName);
            doc.LoadXml(xmlString);
        }
        else
        {
            //outlook file content
            var xmlString = rawContent as MemoryStream;
            doc.Load(xmlString);    
        }

        return doc;
    }

这是我用来处理将windows资源管理器中的文件或outlook中的附件转换为内存流的代码。(ms是表单上的公共memorystream变量)。我相信您可以使用相同的逻辑将其转换为字符串读取器

      Private Sub ubFilepath_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ubFilepath.DragDrop
    Try
        If e.Data.GetDataPresent(DataFormats.Text) Then
            Me.ubFilepath.Text = e.Data.GetData("Text")
        ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
            Dim fileNames() As String
            Dim MyFilename As String
            fileNames = DirectCast(e.Data.GetData(DataFormats.FileDrop), String())
            MyFilename = fileNames(0)
            Me.ubFilepath.Text = MyFilename

        //RenPrivateItem is from outlook

        ElseIf e.Data.GetDataPresent("RenPrivateItem") Then
            Dim thestream As System.IO.MemoryStream = e.Data.GetData("FileGroupDescriptor")
            Dim filename As New System.Text.StringBuilder("")
            Dim fileGroupDescriptor(700) As Byte
            Try
                thestream.Read(fileGroupDescriptor, 0, 700)
                Dim i As Integer = 76
                While fileGroupDescriptor(i) <> 0
                    filename.Append(Convert.ToChar(fileGroupDescriptor(i)))
                    i += 1
                End While
                Me.ubFilepath.Text = "Outlook attachment_" + filename.ToString
                ms = e.Data.GetData("FileContents", True)
            Finally
                If thestream IsNot Nothing Then thestream.Close()
            End Try
        End If
    Catch ex As Exception
        MessageBox.Show(ex.ToString, "Only files can be dragged into this box")
    End Try
Private Sub ubFilepath_DragDrop(ByVal sender作为对象,ByVal e作为System.Windows.Forms.DragEventArgs)处理ubFilepath.DragDrop
尝试
如果e.Data.GetDataPresent(DataFormats.Text),则
Me.ubFilepath.Text=e.Data.GetData(“Text”)
ElseIf e.Data.GetDataPresent(DataFormats.FileDrop)然后
Dim fileNames()作为字符串
将MyFilename设置为字符串
fileNames=DirectCast(e.Data.GetData(DataFormats.FileDrop),String())
MyFilename=文件名(0)
Me.ubFilepath.Text=MyFilename
//RenPrivateItem来自outlook
ElseIf e.Data.GetDataPresent(“RenPrivateItem”),然后
将流设置为System.IO.MemoryStream=e.Data.GetData(“文件组描述符”)
将文件名设置为新System.Text.StringBuilder(“”)
Dim fileGroupDescriptor(700)作为字节
尝试
Read(fileGroupDescriptor,0700)
尺寸i为整数=76
而fileGroupDescriptor(i)0
filename.Append(Convert.ToChar(fileGroupDescriptor(i)))
i+=1
结束时
Me.ubFilepath.Text=“Outlook附件”+filename.ToString
ms=e.Data.GetData(“FileContents”,True)
最后
如果流不是空的,那么stream.Close()
结束尝试
如果结束
特例
Show(例如ToString,“只有文件才能拖到此框中”)
结束尝试