我成功使用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);)它使文件句柄保持在臨時位置,因此我無法刪除它... –