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