목록 상자의 요소를 탐색기에 끌어다 놓으 려합니다. 드래그 앤 드롭이 시작되면 필요에 따라 파일을 준비하고 메모리 스트림에 저장해야합니다. FileGroupDescriptor 데이터 구조를 사용하여 수행하는 방법에 대한 예제를 제공 할 수 있습니까? 감사합니다. . Andreafilegroupdescriptor를 사용하여 파일을 탐색기로 끌어 오는 방법 C#
7
A
답변
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;
}
희망, 안부
저는 C++에서 정말 가난하지 않지만이 기사에서 설명한 것처럼 sizeof() 연산자를 잘못 사용하는 것과 같은 문제가 있습니까? http://www.codeproject.com/KB/cs/UnmanagedArraysInCSharp.aspx 그들은'Marshal.SizeOf'가 마샬링 후 크기를 제공한다고 말합니다. – Maslow