2009-12-04 9 views
7

पर फ़ाइल खींचने के लिए filegroupdescriptor का उपयोग कैसे करें मैं एक्सप्लोरर के लिए सूची बॉक्स का एक तत्व खींच और छोड़ना चाहता हूं। जब ड्रैग और ड्रॉप शुरू होता है, तो मुझे फ़ाइल को मांग पर तैयार करने और इसे मेमोरी स्ट्रीम में सहेजने की आवश्यकता होती है। क्या आप मुझे FileGroupDescriptor डेटा संरचना का उपयोग करके इसे कैसे करें इस पर एक उदाहरण प्रदान कर सकते हैं? धन्यवाद। एंड्रियाएक्सप्लोरर सी #

उत्तर

9

आप यहां यह उदाहरण प्राप्त कर सकते हैं कि यह कैसे करें Transferring Virtual Files to Windows Explorer in C#; यहां विषय पर कुछ अच्छी जानकारी भी दी गई है: Outlook Drag and Drop in C#

कम से कम आपको फ़ाइल ऑब्जेक्ट को FILEDESCRIPTOR के साथ init करना है (आप पिनवोक.net पर इसकी घोषणा विवरण) फ़ाइल (फाइलों) के लिए संरचना (ओं) प्राप्त कर सकते हैं स्थानांतरित और उनकी सामग्री। नीचे एक उदाहरण है कि आप फ़ाइल को Winforms ListBox से एक्सप्लोरर में कैसे स्थानांतरित कर सकते हैं।

माउस नीचे लिस्टबॉक्स के लिए ईवेंट हैंडलर:

private void listBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    DataObject dataObject = new DataObject(); 
    DragFileInfo filesInfo = new DragFileInfo("d:\\test.txt"); 

    using (MemoryStream infoStream = GetFileDescriptor(filesInfo), 
         contentStream = GetFileContents(filesInfo)) 
    { 
     dataObject.SetData(CFSTR_FILEDESCRIPTORW, infoStream); 
     dataObject.SetData(CFSTR_FILECONTENTS, contentStream); 
     dataObject.SetData(CFSTR_PERFORMEDDROPEFFECT, null); 

     DoDragDrop(dataObject, DragDropEffects.All); 
    } 
} 

कोड dataobject init करने की जरूरत:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
struct FILEDESCRIPTOR 
{ 
    public UInt32 dwFlags; 
    public Guid clsid; 
    public System.Drawing.Size sizel; 
    public System.Drawing.Point pointl; 
    public UInt32 dwFileAttributes; 
    public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; 
    public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; 
    public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; 
    public UInt32 nFileSizeHigh; 
    public UInt32 nFileSizeLow; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=260)] 
    public String cFileName; 
} 

public const string CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect"; 
public const string CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect"; 
public const string CFSTR_FILEDESCRIPTORW = "FileGroupDescriptorW"; 
public const string CFSTR_FILECONTENTS = "FileContents"; 

public const Int32 FD_WRITESTIME = 0x00000020; 
public const Int32 FD_FILESIZE = 0x00000040; 
public const Int32 FD_PROGRESSUI = 0x00004000; 

public struct DragFileInfo 
{ 
    public string FileName; 
    public string SourceFileName; 
    public DateTime WriteTime; 
    public Int64 FileSize; 

    public DragFileInfo(string fileName) 
    { 
     FileName = Path.GetFileName(fileName); 
     SourceFileName = fileName; 
     WriteTime = DateTime.Now; 
     FileSize = (new FileInfo(fileName)).Length; 
    } 
} 

private MemoryStream GetFileDescriptor(DragFileInfo fileInfo) 
{ 
    MemoryStream stream = new MemoryStream(); 
    stream.Write(BitConverter.GetBytes(1), 0, sizeof(UInt32)); 

    FILEDESCRIPTOR fileDescriptor = new FILEDESCRIPTOR(); 

    fileDescriptor.cFileName = fileInfo.FileName; 
    Int64 fileWriteTimeUtc = fileInfo.WriteTime.ToFileTimeUtc(); 
    fileDescriptor.ftLastWriteTime.dwHighDateTime = (Int32)(fileWriteTimeUtc >> 32); 
    fileDescriptor.ftLastWriteTime.dwLowDateTime = (Int32)(fileWriteTimeUtc & 0xFFFFFFFF); 
    fileDescriptor.nFileSizeHigh = (UInt32)(fileInfo.FileSize >> 32); 
    fileDescriptor.nFileSizeLow = (UInt32)(fileInfo.FileSize & 0xFFFFFFFF); 
    fileDescriptor.dwFlags = FD_WRITESTIME | FD_FILESIZE | FD_PROGRESSUI; 

    Int32 fileDescriptorSize = Marshal.SizeOf(fileDescriptor); 
    IntPtr fileDescriptorPointer = Marshal.AllocHGlobal(fileDescriptorSize); 
    Byte[] fileDescriptorByteArray = new Byte[fileDescriptorSize]; 

    try 
    { 
     Marshal.StructureToPtr(fileDescriptor, fileDescriptorPointer, true); 
     Marshal.Copy(fileDescriptorPointer, fileDescriptorByteArray, 0, fileDescriptorSize); 
    } 
    finally 
    { 
     Marshal.FreeHGlobal(fileDescriptorPointer); 
    } 
    stream.Write(fileDescriptorByteArray, 0, fileDescriptorByteArray.Length); 
    return stream; 
} 

private MemoryStream GetFileContents(DragFileInfo fileInfo) 
{ 
    MemoryStream stream = new MemoryStream();    
    using (BinaryReader reader = new BinaryReader(File.OpenRead(fileInfo.SourceFileName))) 
    { 
     Byte[] buffer = new Byte[fileInfo.FileSize]; 
     reader.Read(buffer, 0, (Int32)fileInfo.FileSize); 
     if (buffer.Length == 0) buffer = new Byte[1]; 
     stream.Write(buffer, 0, buffer.Length); 
    } 
    return stream; 
} 

आशा है कि यह आप कैसे आगे बढ़ना पर एक विचार दे देंगे, संबंध

+0

मैं सी ++ में वास्तव में खराब हूं लेकिन क्या इस आलेख में चर्चा के रूप में गलत 'sizeof()' ऑपरेटर का उपयोग करने की समस्या है? http://www.codeproject.com/KB/cs/UnmanagedArraysInCSharp.aspx वे कहते हैं कि 'मार्शल.SizeOf' मार्शलिंग के बाद आकार देता है। – Maslow

संबंधित मुद्दे