/// <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); } }