我成功使用VirtualFileDataObject code from Delay's blog,但我想避免流式传输整个文件到内存中。拖放使用VirtualFileDataObject的IStream的大型虚拟文件
我发现以前在Stack Overflow上回答了这个问题Drag and Drop large virtual files from c# to Windows Explorer问题由matthieu通过改变SetData方法的签名来回答。
这是我的问题,在更改SetData方法的签名后,其他调用它的地方仍在寻找旧签名。
这里是原始的SetData;
public void SetData(short dataFormat, int index, Action<Stream> streamData)
{
_dataObjects.Add(
new DataObject
{
FORMATETC = new FORMATETC
{
cfFormat = dataFormat,
ptd = IntPtr.Zero,
dwAspect = DVASPECT.DVASPECT_CONTENT,
lindex = index,
tymed = TYMED.TYMED_ISTREAM
},
GetData =() =>
{
// Create IStream for data
var ptr = IntPtr.Zero;
var iStream = NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true);
if (streamData != null)
{
// Wrap in a .NET-friendly Stream and call provided code to fill it
using (var stream = new IStreamWrapper(iStream))
{
streamData(stream);
}
}
// Return an IntPtr for the IStream
ptr = Marshal.GetComInterfaceForObject(iStream, typeof(IStream));
Marshal.ReleaseComObject(iStream);
return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
},
});
}
matthieu建议将其更改为;
public void SetData(short dataFormat, int index, Stream stream)
{
...
var iStream = new StreamWrapper(stream);
...
// Ensure the following line is commented out:
//Marshal.ReleaseComObject(iStream);
return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
...
}
在做出这些更改后,以下调用将不起作用; (这是我需要帮助的地方) 我该如何解决这个问题;
foreach (var fileDescriptor in fileDescriptors)
{
**SetData(FILECONTENTS, index, fileDescriptor.StreamContents);**
index++;
}
基本上改变“Action streamData”到“Stream stream”导致我的问题。我不确定如何在更改完成后调用它。
所有这些代码来自延迟VirtualFileDataObject。我不知道我是否应该在这里发布它。但是,如果你按照上面的链接,它会带你到博客,所以你可以查看它。
我是如此接近,只是不能走出明白这最后一步,感谢考虑看看
时/我怎么关闭文件上的流??? –
@DavidRefaeli - 当调用者在另一端(无论谁)关闭流时应该调用Dispose。 –
嗯,是的,但如何?你可以举个例子吗?你在哪里打电话ms.Close(),你如何将它传递给外部?在我的情况下,我使用的是我在临时位置创建的实际文件(返回新的FileStream(sanitizedFile,FileMode.Open,FileAccess.Read);)它使文件句柄保持在临时位置,因此我无法删除它... –