Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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);
        }