예제 #1
0
        /// <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());
                }
            }
        }
예제 #2
0
 /// <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
     }
 }
예제 #3
0
        /// <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());
                }
            }
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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());
            }
        }
예제 #6
0
        /// <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);
        }
예제 #7
0
        /// <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());
                }
            }
        }
예제 #8
0
 /// <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));
     }
 }
예제 #9
0
        /// <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);
            }
        }
예제 #10
0
 /// <summary>
 /// Constructor
 /// </summary>
 public SambaClient()
 {
     //Inicialitza el Client samba.
     //Aquesta acció sempre es necessari avans d'utilitzar cap altra funció.
     WrapperSambaClient.SmbInit();
 }