예제 #1
0
        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);
            }
        }
예제 #2
0
        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());
            }
        }