2008-08-31 7 views
3

Ich versuche, die 'richtige' Windows-API zu finden, um den lokalisierten Namen von 'speziellen' Ordnern, speziell dem Papierkorb, herauszufinden. Ich möchte in der Lage sein, den Benutzer mit einem entsprechend lokalisierten Dialogfeld zu fragen, ob er Dateien in den Papierkorb senden oder direkt löschen möchte.Wie bekomme ich den lokalisierten Namen eines 'speziellen' Windows-Ordners (Papierkorb usw.)?

Ich habe viele im Internet (und auf Stackoverflow) über die tatsächliche Löschung gefunden, und es scheint einfach genug, ich möchte nur in der Lage sein, den Text lokalisiert zu haben.

Antwort

2

Lesen Sie diesen Artikel für Codebeispiele und Nutzung:

http://www.codeproject.com/KB/winsdk/SpecialFolders.aspx

auch einen Artikel auf MSDN gibt es, dass Sie Identify the Location of Special Folders with API Calls

+0

Der Code-Projektcode demonstriert wunderbar, wie man diese Information erhält. Ich musste StrRetToStr (...) verwenden, um den zurückgegebenen Wert in einer Form zu erhalten, die JNI in Java verwenden konnte, aber das war einfach genug. –

+0

@FreeWildebeest: Wie haben Sie den Code-Projektcode verwendet, um den lokalisierten Namen von 'speziellen' Ordnern zu erhalten? Ich sehe nicht, was dazu führen kann, in den Code goven, selbst die laufende exe zeigen sie nicht ... Ich versuche, einen Ordner-Pfad, um seinen lokalisierten Namen zu bekommen, wenn es ein spezieller Ordner ist. – Oliver

0

Ich habe nicht den Artikel furchtbar hilfreich, Codeproject finden tatsächlich hilft so Ich dachte, ich würde diese Frage mit dem tatsächlichen Code beantworten, mit dem ich den lokalisierten Namen des Papierkorbs abgerufen habe.

Dieses Beispiel versucht auch, sich in Bezug auf das Freigeben von Ressourcen korrekt zu verhalten. Jegliche Kommentare sind willkommen, besonders wenn Sie einen Fehler bei meiner Ressourcenverwaltung feststellen!

public static string GetLocalizedRecycleBinName() 
{ 
    IntPtr relative_pidl, parent_ptr, absolute_pidl; 

    PInvoke.SHGetFolderLocation(IntPtr.Zero, PInvoke.CSIDL.BitBucket, 
     IntPtr.Zero, 0, out absolute_pidl); 
    try 
    { 
     PInvoke.SHBindToParent(absolute_pidl, 
      ref PInvoke.Guids.IID_IShellFolder, 
      out parent_ptr, out relative_pidl); 
     PInvoke.IShellFolder shell_folder = 
      Marshal.GetObjectForIUnknown(parent_ptr) 
      as PInvoke.IShellFolder; 
     // Release() for this object is called at finalization 
     if (shell_folder == null) 
     return Strings.RecycleBin; 

     PInvoke.STRRET strret = new PInvoke.STRRET(); 
     StringBuilder sb = new StringBuilder(260); 
     shell_folder.GetDisplayNameOf(relative_pidl, PInvoke.SHGNO.Normal, 
      out strret); 
     PInvoke.StrRetToBuf(ref strret, relative_pidl, sb, 260); 
     string name = sb.ToString(); 

     return String.IsNullOrEmpty(name) ? Strings.RecycleBin : name; 
    } 
    finally { PInvoke.ILFree(absolute_pidl); } 
} 

static class PInvoke 
{ 
    [DllImport("shell32.dll")] 
    public static extern int SHGetFolderLocation(IntPtr hwndOwner, 
     CSIDL nFolder, IntPtr hToken, uint dwReserved, out IntPtr ppidl); 

    [DllImport("shell32.dll")] 
    public static extern int SHBindToParent(IntPtr lpifq, [In] ref Guid riid, 
     out IntPtr ppv, out IntPtr pidlLast); 

    [DllImport("shlwapi.dll")] 
    public static extern Int32 StrRetToBuf(ref STRRET pstr, IntPtr pidl, 
     StringBuilder pszBuf, uint cchBuf); 

    [DllImport("shell32.dll")] 
    public static extern void ILFree([In] IntPtr pidl); 

    [ComImport] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("000214E6-0000-0000-C000-000000000046")] 
    public interface IShellFolder 
    { 
     [PreserveSig] 
     Int32 CompareIDs(Int32 lParam, IntPtr pidl1, IntPtr pidl2); 
     void ParseDisplayName(IntPtr hwnd, IntPtr pbc, String pszDisplayName, 
      UInt32 pchEaten, out IntPtr ppidl, UInt32 pdwAttributes); 
     void EnumObjects(IntPtr hwnd, int grfFlags, 
      out IntPtr ppenumIDList); 
     void BindToObject(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, 
      out IntPtr ppv); 
     void BindToStorage(IntPtr pidl, IntPtr pbc, [In] ref Guid riid, 
      out IntPtr ppv); 
     void CreateViewObject(IntPtr hwndOwner, [In] ref Guid riid, 
      out IntPtr ppv); 
     void GetAttributesOf(UInt32 cidl, 
      [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] 
     IntPtr[] apidl, ref uint rgfInOut); 
     void GetUIObjectOf(IntPtr hwndOwner, UInt32 cidl, 
      [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] 
     IntPtr[] apidl, [In] ref Guid riid, UInt32 rgfReserved, 
     out IntPtr ppv); 
     void GetDisplayNameOf(IntPtr pidl, SHGNO uFlags, out STRRET pName); 
     void SetNameOf(IntPtr hwnd, IntPtr pidl, string pszName, 
      int uFlags, out IntPtr ppidlOut); 
    } 

    public enum CSIDL 
    { 
     BitBucket = 0x000a, 
    } 

    public enum SHGNO 
    { 
     Normal = 0x0000, ForParsing = 0x8000, 
    } 

    [StructLayout(LayoutKind.Explicit, Size = 520)] 
    public struct STRRETinternal 
    { 
     [FieldOffset(0)] public IntPtr pOleStr; 
     [FieldOffset(0)] public IntPtr pStr; 
     [FieldOffset(0)] public uint uOffset; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct STRRET 
    { 
     public uint uType; 
     public STRRETinternal data; 
    } 

    public class Guids 
    { 
     public static Guid IID_IShellFolder = 
      new Guid("{000214E6-0000-0000-C000-000000000046}"); 
    } 
}