/// <summary> /// Comprovació de l'existencia d'un directori /// </summary> /// <param name="path"> /// Ruta de la carpeta a comprovar <see cref="System.String"/> /// </param> /// <returns> /// Existeix = True , No existeix = False <see cref="System.Boolean"/> /// </returns> public bool DirectoryExists(string path) { //comrovació d'una ruta samba if (isUNCPath(path)) { int fd; string fullpath = @"smb:" + parseUNCPath(path); //per comprovar si existeix amb samba miro si es pot obir el directori fd = WrapperSambaClient.smbc_opendir(fullpath); if (fd < 0) { if (Stdlib.GetLastError().ToString() == "ENOENT") { return(false); } if (Stdlib.GetLastError().ToString() == "EINVAL") { return(false); } else { throw new Exception(Stdlib.GetLastError().ToString()); } } else { WrapperSambaClient.smbc_close(fd); return(true); } } else { return(Directory.Exists(path)); //comprovació d'una ruta local; realment no es necessari } }
/// <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); }