/// <summary> /// Llegeix el contingut d'una carpeta /// </summary> /// <param name="UNCpath"> /// Ruta de la carpeta que es vol llegir <see cref="System.String"/> /// </param> /// <returns> /// Informació del directori<see cref="CIFSDirInfo"/> /// </returns> public CIFSDirInfo ReadDir(string UNCpath) { CIFSDirInfo dirinfo = new CIFSDirInfo(); int dh = 0; dh = WrapperSambaClient.smbc_opendir(@"smb:" + parseUNCPath(UNCpath)); if (dh < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EACCES" || Stdlib.GetLastError().ToString() == "EROFS") { throw new UnauthorizedAccessException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EINVAL" || Stdlib.GetLastError().ToString() == "ENOENT") { throw new DirectoryNotFoundException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EXDEV") { throw new ArgumentException(Stdlib.GetLastError().ToString()); } } else { IntPtr dirbuf = new IntPtr(); dirbuf = WrapperSambaClient.smbc_readdir(dh); while (dirbuf != IntPtr.Zero) //recorrem tot el directori { SambaDirInfo dir = (SambaDirInfo)Marshal.PtrToStructure(dirbuf, typeof(SambaDirInfo)); //passem el punter a l'estructura dirbuf = WrapperSambaClient.smbc_readdir(dh); //s'ha de controlar quin tipus de recurs s'està llegint System.Console.WriteLine(); if (dir.smbc_type == 7 || dir.smbc_type == 8) { if (dir.name != ".." && dir.name != ".") { if (dir.smbc_type == 7) { dirinfo.addDir(dir.name); //afegim el nom del directori a la matriu de directoris del objecte CIFSDirInfo } if (dir.smbc_type == 8) { dirinfo.addFile(dir.name); //afegim el nom del fitxer a la matriu de fitxers del objecte CIFSDirInfo } } } } WrapperSambaClient.smbc_closedir(dh); } return(dirinfo); }
/// <summary> /// Llista els recursos compartits d'un servidor CIFS /// </summary> /// <param name="UNCpath"> /// Adreça del servidor CIFS (DNS o IP) <see cref="System.String"/> /// </param> /// <returns> /// Col·lecció de recursos compartits <see cref="Shares"/> /// </returns> public Shares ShareEnum(string UNCpath) { /* Realment aquesta mateixa ordre en el cas de samba podria * navegar per una carpeta, però s'ha diferenciat de ReadDir * per compatibilitat en Win32 */ int dh = 0; Shares shares = new Shares(); //Comprovació de l'existencia del recurs o carpeta dh = WrapperSambaClient.smbc_opendir(@"smb:" + parseUNCPath(UNCpath)); if (dh < 0) { throw new IOException(Stdlib.GetLastError().ToString()); } else { IntPtr dirbuf = new IntPtr(); //creem un punter gestionat dirbuf = WrapperSambaClient.smbc_readdir(dh); Share s; while (dirbuf != IntPtr.Zero) { SambaDirInfo dir = (SambaDirInfo)Marshal.PtrToStructure(dirbuf, typeof(SambaDirInfo)); //passem el punter a l'estructura dirbuf = WrapperSambaClient.smbc_readdir(dh); s = new Share(); s.comment = dir.comment; s.name = dir.name; s.type = CommonShareTypes((int)dir.smbc_type); shares.addShare(s); } WrapperSambaClient.smbc_closedir(dh); } return(shares); }