Bueno.. sé que el título es un poco "raro", pero es tal cual lo que necesito. Agradecería a cualquier experto en materia de apis y de conocimientos en .NET me de nociones de como aprender a trabajar con ellas.
Para ello, expongo el siguiente caso, en el que me he visto envuelto y lo he solucionado gracias a las APIS:
Necesitaba recorrer las carpetas compartidas de los equipos de red de mi red(valga la redundancia), para ello vi un código en codeproject, del cual he usado la gran parte:
Código:
Bueno, pues como podeis ver, toda la parte de arriba (Menos los dos últimos métodos) los copié de CodeProject.public class ClsCarpetas { [DllImport("netapi32", CharSet = CharSet.Unicode)] protected static extern int NetShareEnum(string lpServerName, int dwLevel, out IntPtr lpBuffer, int dwPrefMaxLen, out int entriesRead, out int totalEntries, ref int hResume); [Flags] public enum ShareType { /// <summary>Disk share</summary> Disk = 0, /// <summary>Printer share</summary> Printer = 1, /// <summary>Device share</summary> Device = 2, /// <summary>IPC share</summary> IPC = 3, /// <summary>Special share</summary> Special = -2147483648, // 0x80000000, } /// <summary>Share information, NT, level 2</summary> /// <remarks> /// Requires admin rights to work. /// </remarks> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] protected struct SHARE_INFO { [MarshalAs(UnmanagedType.LPWStr)] public string NetName; public ShareType ShareType; [MarshalAs(UnmanagedType.LPWStr)] public string Remark; public int Permissions; public int MaxUsers; public int CurrentUsers; [MarshalAs(UnmanagedType.LPWStr)] public string Path; [MarshalAs(UnmanagedType.LPWStr)] public string Password; } private List<string> ListaDirectorios = new List<string>(); public void GetCarpetas(string direccionEquipo) { int level = 2; int entriesRead, totalEntries, nRet, hResume = 0; IntPtr pBuffer = IntPtr.Zero; nRet = NetShareEnum(direccionEquipo, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume); if (nRet == 0 && entriesRead > 0) { int offset = Marshal.SizeOf(typeof(SHARE_INFO)); for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset) { IntPtr pItem = new IntPtr(lpItem); SHARE_INFO si = (SHARE_INFO)Marshal.PtrToStructure(pItem, typeof(SHARE_INFO)); if (si.ShareType == ShareType.Disk) { string direccionCarpeta = string.Format(@"\\{0]\{1}", direccionEquipo, si.NetName); ListaDirectorios.Add(direccionCarpeta); GetSubDirectorios(direccionCarpeta); //string[] listaDirectorios = Directory.GetDirectories(@"\\192.168.1.138\"); } } } } private void GetSubDirectorios(string pathDirectorio) { string[] directoriosEncontrados = Directory.GetDirectories(pathDirectorio); if (directoriosEncontrados.Length > 0) { foreach(string rutaDirectorio in directoriosEncontrados) { ListaDirectorios.Add(rutaDirectorio); GetSubDirectorios(rutaDirectorio); } } } }
Y en fin, querría saber, como cojones hizo el chico que lo hizo, para saber que tenía que crear:
- El método NetShareEnum.
- La enumeración ShareType y con el atributo [Flags]
- La structura SHARE_INFO
La importación de la DLL netapi32 entiendo que buscando por google te pueda salir, pero... ¿Como cojones pudo saber como crear esas enumeraciones, structuras y demás?
Bueno, agradecería, desde mi humilde postura, pudieran decirme como puedo aprender a manejarme solo con este tema...
Gracias y espero haberme explicado en mi necesidad.
Saludos.