2008-08-31 12 views
3

J'essaie de trouver l'API 'correcte' windows pour trouver le nom localisé des dossiers 'spéciaux', en particulier la corbeille. Je veux être en mesure d'inviter l'utilisateur avec une boîte de dialogue localisée appropriée leur demandant s'ils veulent envoyer des fichiers à la corbeille ou les supprimer directement.Comment puis-je obtenir le nom localisé d'un dossier Windows 'spécial' (Corbeille etc.)?

J'ai trouvé beaucoup sur Internet (et sur Stackoverflow) sur la façon de faire la suppression, et cela semble assez simple, je veux juste pouvoir localiser le texte.

Répondre

2

Lire cet article pour des exemples de code et de l'utilisation:

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

Il y a également un article sur MSDN qui vous aide à Identify the Location of Special Folders with API Calls

+0

Le code de projet de code démontre merveilleusement comment obtenir cette information. J'avais besoin d'utiliser StrRetToStr (...) pour obtenir la valeur retournée sous une forme que JNI pourrait utiliser en Java, mais c'était assez facile. –

+0

@FreeWildebeest: Comment avez-vous utilisé le code du projet de code pour obtenir le nom localisé des dossiers 'spéciaux'? Je ne vois pas ce qui peut conduire à cela dans le code goven, même les exe en cours ne les montrent pas ... J'essaie, donné un chemin de dossier, d'obtenir son nom localisé SI c'est un dossier spécial. – Oliver

0

En fait, je ne trouve pas l'article CodeProject terriblement utile, donc Je pensais que je répondrais à cette question avec le code réel que j'ai utilisé pour récupérer le nom localisé de la corbeille.

Cet exemple essaie également de se comporter correctement en ce qui concerne la libération des ressources. Tous les commentaires sont les bienvenus, surtout si vous repérez une erreur dans la gestion de mes ressources!

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