protected override void _Unir(string fichero, string dirDest) { string baseDir = new FileInfo (fichero).DirectoryName; MetaInfoKamaleon metaInfo = new MetaInfoKamaleon (fichero); long transferidos = 0; if (metaInfo.PrimerInfo == null) throw new NoMetaInfoException (); // Verificamos que todo está en su sitio. foreach (InfoFicheroKamaleon i in metaInfo.infos) { OnProgress (0, 1); string fich = baseDir + Path.DirectorySeparatorChar + i.NombreFragmento; if (!File.Exists (fich)) { throw new System.IO.FileNotFoundException ("", fich); } byte primer = UtilidadesFicheros.LeerByte (fich, 0); byte ultimo = UtilidadesFicheros.LeerByte (fich, i.TamanoFragmento - 1); if ((primer != i.PrimerByte) || (ultimo != i.UltimoByte)) { throw new Dalle.Formatos.FileFormatException ("Invalid fileFormat:" + fich); } } string f = metaInfo.PrimerInfo.NombreOriginal; UtilidadesFicheros.ComprobarSobreescribir (f); OnProgress (0, 1); foreach (InfoFicheroKamaleon i in metaInfo.infos) { //Copiar la zona de datos del fragmento al archivo destino string fich = baseDir + Path.DirectorySeparatorChar + i.NombreFragmento; crc.Reset (); // TODO Optimizar este metodo (evitar abrir el archivo dos veces) UtilidadesFicheros.CalcularCRC (fich, 0, i.TamanoPiel, crc); transferidos += UtilidadesFicheros.CopiarIntervalo(fich, f, i.TamanoPiel, i.TamanoDatos, crc); if (crc.Value != i.Checksum){ throw new Dalle.Formatos.ChecksumVerificationException("Checksum failed:"+fich, fich); } OnProgress (transferidos, i.TamanoOriginal); } }
protected void _Partir(string fichero, string s1, string dir,long kb, string version) { byte[] piel = UtilidadesRecursos.GetImagen("Piel-01.jpg"); long tamano = 1024 * kb - piel.Length; if ((s1 == null) || (s1 == string.Empty)){ s1 = new FileInfo(fichero).Name; } string salida1 = dir + Path.DirectorySeparatorChar + s1; int secuencia = 1; int tamanoOriginal = (int) new FileInfo(fichero).Length; long transferidos = 0; OnProgress (0,1); MetaInfoKamaleon mi = new MetaInfoKamaleon(); do{ byte[] b = UtilidadesFicheros.LeerSeek (fichero, transferidos, tamano); transferidos += b.Length; InfoFicheroKamaleon inf = InfoFicheroKamaleon.NewFromVersion (version); inf.NombreOriginal = fichero; inf.TamanoOriginal = tamanoOriginal; inf.Password = ""; inf.NombreFragmento = string.Format (salida1 + "{0:000}.jpg", secuencia); inf.TamanoFragmento = piel.Length + b.Length; inf.PrimerByte = piel[0]; inf.UltimoByte = b[b.Length - 1]; inf.TamanoPiel = piel.Length; crc.Reset(); UtilidadesFicheros.Append (inf.NombreFragmento, piel, crc); UtilidadesFicheros.Append (inf.NombreFragmento, b, crc); inf.Checksum = crc.Value; mi.Add (inf); // TODO: Comprobar que no se sobreescribe ningun fichero. secuencia++; OnProgress (transferidos, tamanoOriginal); }while (transferidos < tamanoOriginal); long t_ultimo = new FileInfo (mi.UltimoInfo.NombreFragmento).Length; if ((t_ultimo + mi.Size) > (kb * 1024) ){ InfoFicheroKamaleon inf = InfoFicheroKamaleon.NewFromVersion (version); inf.NombreOriginal = fichero; inf.TamanoOriginal = tamanoOriginal; inf.Password = ""; inf.NombreFragmento = string.Format (salida1 + "{0:000}.jpg", secuencia); inf.TamanoFragmento = piel.Length; inf.PrimerByte = piel[0]; inf.UltimoByte = piel[piel.Length - 1]; inf.TamanoPiel = piel.Length; mi.Add (inf); // TODO: Comprobar que no se sobreescribe ningun fichero. UtilidadesFicheros.ComprobarSobreescribir(inf.NombreFragmento); UtilidadesFicheros.Append (inf.NombreFragmento, piel); UtilidadesFicheros.Append (inf.NombreFragmento, mi.ToByteArray()); } else{ UtilidadesFicheros.Append (mi.GetNombreUltimoFragmento(), mi.ToByteArray()); } }