/// <summary> /// Canvia el nom d'un directori /// </summary> /// <param name="spath"> /// Ruta del directori original <see cref="System.String"/> /// </param> /// <param name="dpath"> /// Ruta del directori després de canviar-li el nom <see cref="System.String"/> /// </param> public void RenameDirectory(string spath, string dpath) { int res = WrapperSambaClient.smbc_rename(@"smb:" + parseUNCPath(spath), @"smb:" + parseUNCPath(dpath)); if (res < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EEXIST") { throw new IOException(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()); } } }
/// <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> /// Canvia el nom d'un directori /// </summary> /// <param name="sourceFileName"> /// Ruta del directori original <see cref="System.String"/> /// </param> /// <param name="destFileName"> /// Ruta del directori després de canviar-li el nom <see cref="System.String"/> /// </param> public void Rename( string sourceFileName, string destFileName) { int res = WrapperSambaClient.smbc_rename(@"smb:" + parseUNCPath(sourceFileName), @"smb:" + parseUNCPath(destFileName)); if (res < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EEXIST") { throw new IOException(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 FileNotFoundException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EXDEV") { throw new NotSupportedException(Stdlib.GetLastError().ToString()); } } }
/// <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> /// Elimina un fitxer /// </summary> /// <param name="path"> /// Ruta del fitxer que es vol eliminar <see cref="System.String"/> /// </param> public void Delete( string path ) { int res = WrapperSambaClient.smbc_unlink(@"smb:" + parseUNCPath(path)); if (res < 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" || Stdlib.GetLastError().ToString() == "ETIMEDOUT") { throw new DirectoryNotFoundException(Stdlib.GetLastError().ToString()); } throw new IOException(Stdlib.GetLastError().ToString()); } }
/// <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); }
/// <summary> /// Elimina un directori /// </summary> /// <param name="path"> /// Ruta del directri que es vol eliminar <see cref="System.String"/> /// </param> public void DeleteDirectory( string path ) { //no cal comprovar la exitencia, ja tractem l'error int res = WrapperSambaClient.smbc_rmdir(@"smb:" + parseUNCPath(path)); if (res < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EEXIST" || Stdlib.GetLastError().ToString() == "EROFS") { throw new IOException("El directori ja exiteix"); } if (Stdlib.GetLastError().ToString() == "EACCES") { throw new UnauthorizedAccessException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EINVAL" || Stdlib.GetLastError().ToString() == "ENOENT") { throw new DirectoryNotFoundException(Stdlib.GetLastError().ToString()); } } }
/// <summary> /// Comprovació de l'existencia d'un fitxer /// </summary> /// <param name="path"> /// Ruta del fitxer a comprovar <see cref="System.String"/> /// </param> /// <returns> /// Existeix = True , No existeix = False <see cref="System.Boolean"/> /// </returns> public bool Exists(string path) { //comprovació del fitxer remot if (isUNCPath(path)) { int fd; string fullpath = @"smb:" + parseUNCPath(path); //per comprovar si existeix en samba miro si es pot obrir fd = WrapperSambaClient.smbc_open(fullpath, (int)OpenFlags.O_RDONLY, (int)FileMode.Open); 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 { //si es pot obrir el tanco. WrapperSambaClient.smbc_close(fd); return(true); } } else //comprovació del fitxer local { return(File.Exists(path)); } }
/// <summary> /// Copia un fitxer remot a un ruta remota /// /// Aquesta funció esta marcada com a unsafe, ja que s'ha de utilitzar un punter directe a memoria /// </summary> /// <param name="sourceFileName"> /// Fitxer origen <see cref="System.String"/> /// </param> /// <param name="destFileName"> /// Fitxer destinació <see cref="System.String"/> /// </param> /// <param name="overwrite"> /// Permet la reescritura d'un fitxer ja exitent. <see cref="System.Boolean"/> /// </param> unsafe private void CopySambaToSamba(string sourceFileName, string destFileName, bool overwrite) { int bytesRead = 1024; byte[] buffer = new byte[bytesRead]; fixed(void *b = buffer) //La instrucció fixed evita que el recolector de elements no utilitzats ubique de nou la varaible. { int fs; int fd; int res; //comprovem que exiteix el fitxer origen if (!Exists(sourceFileName)) { throw new FileNotFoundException("Fitxer Origen no existeix"); } //comprvem si existeix el fitxer destinació, sino el creem if (!Exists(destFileName)) { fd = WrapperSambaClient.smbc_creat(@"smb:" + parseUNCPath(destFileName), (int)FileMode.CreateNew); if (fd < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EACCES" || Stdlib.GetLastError().ToString() == "EROFS" || Stdlib.GetLastError().ToString() == "EBADF") { throw new UnauthorizedAccessException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EINVAL" || Stdlib.GetLastError().ToString() == "ENOENT") { throw new FileNotFoundException(Stdlib.GetLastError().ToString()); } } WrapperSambaClient.smbc_close(fd); } else if (!overwrite) //si el fitxer ja existeix i no es vol sobreescriure salta una exepcio { throw new IOException("El fitxer destí ja exiteix"); } //obrim els dos fitxers fs = WrapperSambaClient.smbc_open(@"smb:" + parseUNCPath(sourceFileName), (int)OpenFlags.O_RDONLY, (int)FileMode.Open); if (fs < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EACCES" || Stdlib.GetLastError().ToString() == "EROFS" || Stdlib.GetLastError().ToString() == "EBADF") { throw new UnauthorizedAccessException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EINVAL" || Stdlib.GetLastError().ToString() == "ENOENT") { throw new FileNotFoundException(Stdlib.GetLastError().ToString()); } } fd = WrapperSambaClient.smbc_open(@"smb:" + parseUNCPath(destFileName), (int)OpenFlags.O_WRONLY, (int)FileMode.CreateNew); if (fd < 0) { System.Console.WriteLine(Stdlib.GetLastError().ToString()); if (Stdlib.GetLastError().ToString() == "EACCES" || Stdlib.GetLastError().ToString() == "EROFS" || Stdlib.GetLastError().ToString() == "EBADF") { throw new UnauthorizedAccessException(Stdlib.GetLastError().ToString()); } if (Stdlib.GetLastError().ToString() == "EINVAL" || Stdlib.GetLastError().ToString() == "ENOENT") { throw new FileNotFoundException(Stdlib.GetLastError().ToString()); } } //copiem el contigut while ((res = WrapperSambaClient.smbc_read(fs, b, bytesRead)) > 0) { WrapperSambaClient.smbc_write(fd, b, res); } WrapperSambaClient.smbc_close(fd); WrapperSambaClient.smbc_close(fs); } }
/// <summary> /// Constructor /// </summary> public SambaClient() { //Inicialitza el Client samba. //Aquesta acció sempre es necessari avans d'utilitzar cap altra funció. WrapperSambaClient.SmbInit(); }