2009-12-04 3 views

답변

9

여기에서이 작업을 수행하는 방법에 대한 예제를 찾을 수 있습니다. Transferring Virtual Files to Windows Explorer in C#; 또한 여기에 주제에 대한 좋은 정보가 있습니다 : Outlook Drag and Drop in C#

간단히 말해서 FILEDESCRIPTOR (pinvoke.net에 대한 선언 세부 정보는 찾을 수 있습니다) 구조로 파일을 초기화하는 것입니다. 전송 된 콘텐츠. 다음은 winboxs 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); 
    } 
} 

코드 :이 당신에게 진행 방법에 대한 아이디어를 줄 것이다

[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

저는 C++에서 정말 가난하지 않지만이 기사에서 설명한 것처럼 sizeof() 연산자를 잘못 사용하는 것과 같은 문제가 있습니까? http://www.codeproject.com/KB/cs/UnmanagedArraysInCSharp.aspx 그들은'Marshal.SizeOf'가 마샬링 후 크기를 제공한다고 말합니다. – Maslow