C# 是否将文件从TrueCrypt卷复制到剪贴板?
我使用以下代码将文件复制到剪贴板:C# 是否将文件从TrueCrypt卷复制到剪贴板?,c#,file,clipboard,truecrypt,C#,File,Clipboard,Truecrypt,我使用以下代码将文件复制到剪贴板: IDataObject data = new DataObject(); data.SetData(DataFormats.FileDrop, new string[] {@"X:\test.doc"}); MemoryStream memo = new MemoryStream(4); byte[] bytes = new byte[] { (byte)(5), 0, 0, 0 }; memo.Write(bytes, 0, bytes.Length); d
IDataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, new string[] {@"X:\test.doc"});
MemoryStream memo = new MemoryStream(4);
byte[] bytes = new byte[] { (byte)(5), 0, 0, 0 };
memo.Write(bytes, 0, bytes.Length);
data.SetData("Preferred DropEffect", memo);
Clipboard.SetDataObject(data);
不幸的是,如果磁盘是TrueCrypt装载的卷,则这不起作用。在TrueCrypt卷上执行此操作的方法是什么?不幸的是,如果没有合适的Shell ID列表,我认为您无法逃脱,在我的Windows 7上,您的代码甚至不能与常规文件系统一起工作。正确的代码首先应提供CIDL:
var data = new DataObject();
var files = new StringCollection() { @"T:\Test.doc" };
data.SetFileDropList(files);
data.SetData("Preferred DropEffect", true, new MemoryStream(new byte[] { 5, 0, 0, 0 }));
data.SetData("Shell IDList Array", true, CreateShellIDList(files));
Clipboard.SetDataObject(data, true);
其中CreateShellIDList
创建所需的CIDA(CFSTR_SHELLIDLIST)结构的二进制表示。实施情况如下:
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr ILCreateFromPath(string path);
[DllImport("shell32.dll", CharSet = CharSet.None)]
public static extern void ILFree(IntPtr pidl);
[DllImport("shell32.dll", CharSet = CharSet.None)]
public static extern int ILGetSize(IntPtr pidl);
private static MemoryStream CreateShellIDList(StringCollection filenames)
{
// first convert all files into pidls list
int pos = 0;
byte[][] pidls = new byte[filenames.Count][];
foreach (var filename in filenames)
{
// Get pidl based on name
IntPtr pidl = ILCreateFromPath(filename);
int pidlSize = ILGetSize(pidl);
// Copy over to our managed array
pidls[pos] = new byte[pidlSize];
Marshal.Copy(pidl, pidls[pos++], 0, pidlSize);
ILFree(pidl);
}
// Determine where in CIDA we will start pumping PIDLs
int pidlOffset = 4 * (filenames.Count + 2);
// Start the CIDA stream stream
var memStream = new MemoryStream();
var sw = new BinaryWriter(memStream);
// Initialize CIDA witha count of files
sw.Write(filenames.Count);
// Calcualte and write relative offsets of every pidl starting with root
sw.Write(pidlOffset);
pidlOffset += 4; // root is 4 bytes
foreach(var pidl in pidls)
{
sw.Write(pidlOffset);
pidlOffset += pidl.Length;
}
// Write the root pidl (0) followed by all pidls
sw.Write(0);
foreach(var pidl in pidls) sw.Write(pidl);
// stream now contains the CIDA
return memStream;
}
我不能把所有的功劳都归功于此,我不久前发现了这个CIDA代码,并将其移植到了c#。我真的记不清原始来源,但到目前为止它工作得很好(我刚刚在TrueCrypt上测试过它)祝贺你的世纪:)它到底怎么不工作?它会显示在剪贴板查看器中吗?Thnks要知道答案,我会检查它(首先,需要在这个计算机上安装TrueCrypt。无论如何,我的代码在WiNoWS 7专业版上运行,我只是复制粘贴并测试它,但是这并不重要。它的工作原理,我知道必须考虑设置shell位置的东西,但是找不到任何东西。CreateShellID的C++实现的最初开发人员名单上的人是帕斯卡·赫尼。