2011-02-02 19 views
6

Ben Panoya dosyaları kopyalamak için bu kodu kullanın: Disk TrueCrypt monte hacmi iseDosyayı TrueCrypt biriminden panoya kopyalayın?

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); 

Maalesef bu işe yaramaz. Bunu bir TrueCrypt biriminde yapmanın yolu nedir?

+0

İyi soru +1. – Shoban

+0

Yüzyılınız kutlu olsun :) –

+2

tam olarak nasıl çalışmıyor? pano görüntüleyicide hiç görünmüyor mu? – fejesjoco

cevap

5

Maalesef, doğru bir Kabuk Kimliği listesi olmadan uzaklaşabileceğinizi düşünmüyorum, Windows 7'de kodunuz normal dosya sistemiyle çalışmıyor. doğru kod öncelikle bir CIDL sağlayacaktır: CreateShellIDList gerekli CIDA (CFSTR_SHELLIDLIST) yapısının bir ikili gösterimini oluşturur

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); 

. Uygulama aşağıdaki gibidir:

[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; 
} 

Burada bütün kredi alamaz, ben bir süre önce bu CIDA kodu bulundu ve sadece C# için taşıdık. Orijinal kaynağı gerçekten hatırlayamıyorum ama şu ana kadar gayet iyi çalışıyor (sadece TrueCrypt üzerinde de test ettim)

+0

Cevap için Thnks, ben kontrol edeceğim (önce bu bilgisayarda TrueCrypt yüklemeniz gerekir. Her neyse, kodum Winodws 7 Professional üzerinde çalışıyor, sadece kopyala yapıştırdım ve test ettim, ama bu daha az önemli. –

+0

Kabuk konumlarını ayarlamayı düşünen bir şey yapılacağını biliyordum, ancak bu konuda hiçbir şey bulamadı: –

+0

CreateShellIDList'in C++ uygulamasının özgün geliştiricisi Pascal Hurni idi. – pcunite

İlgili konular