elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Partir archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Partir archivo  (Leído 6,548 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Partir archivo
« en: 24 Mayo 2015, 00:32 am »

Hola:

Tengo archivos llamado .bin.

Si elijo un archivo que pesa 2048 KBytes. Quiero hacer un programa con Visual C# o en modo consola que sea capaz de partirlo a 1024 KBytes, exactamente partirlo por la mitad, no casi la mitad, sino la mitad exacto.

Cuando sea capaz de hacerlo, que lo vuelva a unir y que estor archivos no estén corruptos.

He buscado enlaces por aquí, se usa Split, pero esn para cadenas en las variables o dentro de los textos.
http://www.geekpedia.com/tutorial201_Splitting-and-joining-files-using-Csharp.html
http://www.c-sharpcorner.com/UploadFile/sayginteh/FileMergerandSplitterinCS12052005011745AM/FileMergerandSplitterinCS.aspx
http://www.codeproject.com/Articles/8873/Utilty-to-split-and-merge-files
http://socketprogramming.blogspot.com.ar/2008/11/split-and-assemble-large-file-around.html

¿Alguna ayudita para empezar aunque sea en modo consola?

Saludos.


En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Partir archivo
« Respuesta #1 en: 24 Mayo 2015, 02:33 am »

Estuve pensando sobre lo que quieres hacer y me vino a la mente trabajar con unos FileStream y funciona, lo que pasa que a la hora de crear los buffers (byte[]) tienes que tener bien en cuenta el tamaño que le vas a dar para que tengan el tamaño exacto a la hora de unirlos. Para que no te queden corruptos, tienes que tener en cuenta bien la longitud de los ficheros que creas nuevos. Fijándote bien si la longitud del archivo es par o impar, para saber como controlar eso a la hora de picar el archivo. La clase FileStream tiene un método .Read() con el cual puedes leer (y guardar en un buffer (byte[]) desde una posición dada (offset) una cantidad de bytes determinados.

No se si esta sea la mejor manera de hacerlo, pero es una.

Puedes ir trabajando por ahi, me gustaría poder tirar el código ahora y ayudarte más pero ahora mismo estoy con poco tiempo, pero más tarde si tengo la oportunidad te ayudo un poco más.

Salu2s



Añado:

Como te había comentado, estuve viendo una forma de hacerlo, que quizás no sea la mejor, pero me funciono bien. (No siempre la primera vez es la mejor forma de hacerlo) Ahora solo te queda ver si esto te sirve o puedes/quieres hacerle modificaciones:

Código
  1. static void SplitFiles(string file)
  2.        {
  3.            FileStream loadedFile = new FileStream(file, FileMode.Open);
  4.  
  5.            //Aquí calculamos la primera mitad del archivo analizando si es par o impar la longitud completa.
  6.            //En caso de que sea par le añadimos 1 y sino le añadimos 0 (lo dejamos como va)
  7.            long firstHalfLength = (loadedFile.Length / 2) + ((loadedFile.Length % 2 != 0) ? 1 : 0);
  8.            long secondHalfLength = loadedFile.Length / 2;
  9.  
  10.            //Creamos los bufferes con el tamaño calculado
  11.            byte[] firstHalf = new byte[firstHalfLength];
  12.            byte[] secondHalf = new byte[secondHalfLength];
  13.  
  14.            //Léemos los bytes del FileStream y los pasamos a los bufferes
  15.            loadedFile.Read(firstHalf, 0, firstHalf.Length); //Lees la primera mitad
  16.            loadedFile.Read(secondHalf, 0, secondHalf.Length); //Lees la segunda mitad
  17.  
  18.            loadedFile.Close();
  19.  
  20.            //Creamos los FileStream para los nuevos ficheros y escribimos los bytes en los mismos
  21.            FileStream firstFile = new FileStream("fichero1.part1", FileMode.Create);
  22.            firstFile.Write(firstHalf, 0, firstHalf.Length);
  23.  
  24.            firstFile.Close();
  25.  
  26.            FileStream secondFile = new FileStream("fichero1.part2", FileMode.Create);
  27.            secondFile.Write(secondHalf, 0, secondHalf.Length);
  28.  
  29.            secondFile.Close();
  30.        }
  31.  
  32.        static void JoinFiles(string file1 , string file2)
  33.        {
  34.            //Abrimos los FileStream de los archivos
  35.            FileStream fileStream1 = new FileStream(file1, FileMode.Open);
  36.            FileStream fileStream2 = new FileStream(file2, FileMode.Open);
  37.  
  38.            //Creamos el buffer para los bytes
  39.            byte[] joinedFiles = new byte[fileStream1.Length + fileStream2.Length];
  40.  
  41.            //Leemos la primera mitad del archivo y la guardamos en el buffer nuevo
  42.            fileStream1.Read(joinedFiles, 0, (int)fileStream1.Length);
  43.            //Leemos la segunda mitad del archivo
  44.            fileStream2.Read(joinedFiles, (int)(fileStream1.Length), (int)fileStream2.Length);
  45.  
  46.            fileStream1.Close();
  47.            fileStream2.Close();
  48.  
  49.            //Escribimos el contenido del buffer en el nuevo fichero
  50.            FileStream joinedFileStream = new FileStream("output.jpg", FileMode.Create);
  51.            joinedFileStream.Write(joinedFiles, 0, joinedFiles.Length);
  52.            joinedFileStream.Close();  
  53.        }

Lo hice haciendo dos métodos, uno para picarlo y otro para unirlos. Puedes mejorarlo para que al unirlo puedas identificar que archivos tiene que unir automáticamente al pasarle el nombre del primer archivo.

Una manera de llamarlo sería:

Código
  1. SplitFiles("file.jpg");
  2. JoinFiles("fichero1.part1", "fichero1.Part2");



Añado: Veo que publicaste otro tema sobre lo mismo con algún código. Bueno, cualquier otra duda ya sabes. Pregunta

Salu2s
Veo que publicaste


« Última modificación: 25 Mayo 2015, 21:01 pm por DarK_FirefoX » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Partir archivo
« Respuesta #2 en: 28 Mayo 2015, 02:25 am »

Aaquí tienes mi solución compelta para partir y unir archivos, eso si, lo desarrollé en VB.Net pero cómo siempre intentaré ayudar con la conversión en C# (conversión online y luego post-modificada por mi, pero no lo he llegado a testear).

Por supuesto lo he desarrollado teniendo en cuenta que sea capaz de partir archivos exactamente a la mitad (teniendo en cuenta que 1 byte es la unidad, por ende, un archivo de 3 bytes no se podrá partir en 2 partes, a menos que adaptes el código fuente para incrementarle 1 byte a una de las dos partes en el buffer de escritura),
si la idea te ha gustado y quieres utilizarla pero no te funciona la traducción a C#, siempre puedes compilar el código original escrito en VB.Net a una librería, y utilizarla desde tu proyecto C#.



Características

Partir archivo en trozos según el tamaño de trozo especificado.
Partir archivo en trozos según la cantidad de trozos especificada.
Unir archivo previamente partido.
Sobreescribir archivos, eliminar restos de archivos...
Eventos para reportar el progreso (porcentajes) de las operaciones de partir y unir.



Modo de empleo

VB.Net:
Código
  1. ''' <summary>
  2. ''' Handles the <see cref="FileSplitter"/> instance.
  3. ''' </summary>
  4. Private WithEvents splitter As New FileSplitter() With {.BufferSize = .BufferSize}
  5.  
  6. ' The file to split.
  7. Private ReadOnly filePath As String = "C:\File.ext"
  8.  
  9. ' Split by chunk size.
  10. Me.splitter.Split(sourceFile:=filePath,
  11.                  chunkSize:=CInt(New IO.FileInfo(filePath).Length / 2),
  12.                  chunkName:="File.Part",
  13.                  chunkExt:="fs",
  14.                  overwrite:=True,
  15.                  deleteAfterSplit:=False)
  16.  
  17. ' Or split by chunk amount.
  18. Me.splitter.Split(sourceFile:=filePath,
  19.                  chunkCount:=2,
  20.                  chunkName:="File.Part",
  21.                  chunkExt:="fs",
  22.                  overwrite:=True,
  23.                  deleteAfterSplit:=True)
  24.  
  25. ''' <summary>
  26. ''' Handles the <see cref="FileSplitter.SplitProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  27. ''' </summary>
  28. ''' <param name="sender">The source of the event.</param>
  29. ''' <param name="e">The <see cref="FileSplitter.SplitProgressChangedArgs"/> instance containing the event data.</param>
  30. Private Sub Splitter_SplitProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.SplitProgressChangedArgs) _
  31. Handles splitter.SplitProgressChanged
  32.  
  33.    labelSplit1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
  34.    labelSplit2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
  35.    labelSplit3.Text = String.Format("Current  Chunk: {0} of {1}", CStr(e.ChunksCreated + 1), CStr(e.ChunksToCreate))
  36.  
  37. End Sub
  38.  
  39. ''' <summary>
  40. ''' Handles the <see cref="FileSplitter.MergeProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  41. ''' </summary>
  42. ''' <param name="sender">The source of the event.</param>
  43. ''' <param name="e">The <see cref="FileSplitter.MergeProgressChangedArgs"/> instance containing the event data.</param>
  44. Private Sub Splitter_MergeProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.MergeProgressChangedArgs) _
  45. Handles splitter.MergeProgressChanged
  46.  
  47.    labelMerge1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
  48.    labelMerge2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
  49.    labelMerge3.Text = String.Format("Current  Chunk: {0} of {1}", CStr(e.ChunksMerged + 1), CStr(e.ChunksToMerge))
  50.  
  51. End Sub

C#:
Código
  1. /// <summary>
  2. /// Handles the <see cref="FileSplitter"/> instance.
  3. /// </summary>
  4. private FileSplitter splitter = new FileSplitter { BufferSize = .BufferSize };
  5.  
  6. // The file to split.
  7. private readonly string filePath = "C:\\File.ext";
  8.  
  9. // Split by chunk size.
  10. this.splitter.Split(sourceFile: filePath,
  11.                    chunkSize: Convert.ToInt32(new IO.FileInfo(filePath).Length / 2),
  12.                    chunkName: "File.Part",
  13.                    chunkExt: "fs",
  14.                    overwrite: true,
  15.                    deleteAfterSplit: false);
  16.  
  17. // Or split by chunk amount.
  18. this.splitter.Split(sourceFile: filePath,
  19.                    chunkCount: 2, chunkName: "File.Part",
  20.                    chunkExt: "fs",
  21.                    overwrite: true,
  22.                    deleteAfterSplit: true);
  23.  
  24. /// <summary>
  25. /// Handles the <see cref="FileSplitter.SplitProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  26. /// </summary>
  27. /// <param name="sender">The source of the event.</param>
  28. /// <param name="e">The <see cref="FileSplitter.SplitProgressChangedArgs"/> instance containing the event data.</param>
  29. private void Splitter_SplitProgressChangedArgs(object sender, FileSplitter.SplitProgressChangedArgs e)
  30. {
  31.  labelSplit1.Text = string.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"));
  32.  labelSplit2.Text = string.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"));
  33.  labelSplit3.Text = string.Format("Current  Chunk: {0} of {1}", Convert.ToString(e.ChunksCreated + 1), Convert.ToString(e.ChunksToCreate));
  34. }
  35.  
  36. /// <summary>
  37. /// Handles the <see cref="FileSplitter.MergeProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  38. /// </summary>
  39. /// <param name="sender">The source of the event.</param>
  40. /// <param name="e">The <see cref="FileSplitter.MergeProgressChangedArgs"/> instance containing the event data.</param>
  41. private void Splitter_MergeProgressChangedArgs(object sender, FileSplitter.MergeProgressChangedArgs e)
  42. {
  43.  labelMerge1.Text = string.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"));
  44.  labelMerge2.Text = string.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"));
  45.  labelMerge3.Text = string.Format("Current  Chunk: {0} of {1}", Convert.ToString(e.ChunksMerged + 1), Convert.ToString(e.ChunksToMerge));
  46. }
  47.  
  48. '=======================================================
  49. 'Service provided by Telerik (www.telerik.com)
  50. '=======================================================



Código fuente
VB.Net: http://pastebin.com/kyqkdXZj
C#: http://pastebin.com/DKfCWuw1

Demo Form
VB.Net: http://pastebin.com/BjzEhPdd
C#: http://pastebin.com/Fq0QCJRi


« Última modificación: 28 Mayo 2015, 02:45 am por Eleкtro » En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Partir archivo
« Respuesta #3 en: 28 Mayo 2015, 02:40 am »

Excelente @Eleкtro. Una clase bien limpia y comentada. Entendí varias cosas que no estaba muy claro. Ya con esto @Meta no tendrá problemas.

Salu2s
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Partir archivo
« Respuesta #4 en: 28 Mayo 2015, 02:54 am »

Excelente @Eleкtro. Una clase bien limpia y comentada.

Gracias pero creo que se te olvidó decir que también es una solución demasiado basta (grande, exagerada) xD, soy consciente de ello, para partir un archivo de 2 mb en 2 trozos no es necesario tanto y tu solución es suficiente y efectiva, yo simplemente comparto esto por que me apetecía crear un código rehutilizable que sirva para ayudar a resolver este problema pero también para ayudar a resolver otras necesidades y con algunas funcionalidades adicionales.

Saludos!
En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Partir archivo
« Respuesta #5 en: 28 Mayo 2015, 03:38 am »

Gracias pero creo que se te olvidó decir que también es una solución demasiado basta (grande, exagerada) xD, soy consciente de ello, para partir un archivo de 2 mb en 2 trozos no es necesario tanto y tu solución es suficiente y efectiva, yo simplemente comparto esto por que me apetecía crear un código rehutilizable que sirva para ayudar a resolver este problema pero también para ayudar a resolver otras necesidades y con algunas funcionalidades adicionales.

Saludos!

Quizás sea "exagerada" para el objetivo que tenía @Meta, pero en lo personal, siempre encuentro fascinante poder aprender algo y ampliar mi perspectiva de las cosas en cuanto a programación se refiere. Presto especial atención a nuevos puntos de vistas y perspectivas diferentes a las mías.

PD: Sigo leyendo la clase para seguir entendiendo todo, así que te preguntaré si tengo alguna duda en algo!

En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Partir archivo
« Respuesta #6 en: 4 Junio 2015, 18:22 pm »

Hola:

Muchas gracias a todos.

Probaré los ejemplos y eso que el primero me funciona de maravilla,a menos partirlo.
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using System.IO; // No olvidar.
  8.  
  9. namespace Partir_Archivo
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.  
  16.            const int CHUNKSIZE = 1024 * 1024;
  17.            byte[] buffer;
  18.            int i = 1;
  19.  
  20.            FileStream infile = new FileStream(@"Archivo.bin", FileMode.Open, FileAccess.Read);
  21.            BinaryReader reader = new BinaryReader(infile);
  22.  
  23.            reader.BaseStream.Position = 0;
  24.            buffer = reader.ReadBytes(CHUNKSIZE);
  25.            while (buffer.Length != 0)
  26.            {
  27.                FileStream outfile = new FileStream(@"File_" + i + ".bin", FileMode.CreateNew, FileAccess.Write);
  28.                BinaryWriter writer = new BinaryWriter(outfile);
  29.  
  30.                writer.Write(buffer);
  31.                writer.Flush();
  32.                writer.Close();
  33.                outfile.Close();
  34.  
  35.                buffer = reader.ReadBytes(CHUNKSIZE);
  36.                i++;
  37.            }
  38.  
  39.            reader.Close();
  40.            infile.Close();
  41.        }
  42.    }
  43. }
  44.  
  45.  
  46.  

Analizaré los ejemplos de arriba que me han mostrado.

El tema de si hay 3 bytes, se puede partir de esta manera.

Primer archivo ocupa dos bytes y el segundo 1 byte, sin problemas.

Una pregunta que les hago

Tengo un archivo de 48 M bit, quiero partir uno de 32 Mb (no Mega Byte) y el otro se queda en 16 M bit.

¿Cómo lo hago?

Esto ya es más complicado, ya que quiero hacer un Form bien hecho que pueda elegir el archivo donde lo tengo ubicado, esta parte si se hacerlo, encontrar el archivo, ejejjeje. Ahora me falta esta parte como curiosidad, partirlo como y quiera. Si parto el de 48 Mb a 32 el primer archivo, luego crea el resto que sobra que son 16 M Bit como dije antes.

Saludos.
« Última modificación: 4 Junio 2015, 18:35 pm por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Partir archivo
« Respuesta #7 en: 4 Junio 2015, 23:26 pm »

Estuve pensando sobre lo que quieres hacer y me vino a la mente trabajar con unos FileStream y funciona, lo que pasa que a la hora de crear los buffers (byte[]) tienes que tener bien en cuenta el tamaño que le vas a dar para que tengan el tamaño exacto a la hora de unirlos. Para que no te queden corruptos, tienes que tener en cuenta bien la longitud de los ficheros que creas nuevos. Fijándote bien si la longitud del archivo es par o impar, para saber como controlar eso a la hora de picar el archivo. La clase FileStream tiene un método .Read() con el cual puedes leer (y guardar en un buffer (byte[]) desde una posición dada (offset) una cantidad de bytes determinados.

No se si esta sea la mejor manera de hacerlo, pero es una.

Puedes ir trabajando por ahi, me gustaría poder tirar el código ahora y ayudarte más pero ahora mismo estoy con poco tiempo, pero más tarde si tengo la oportunidad te ayudo un poco más.

Salu2s



Añado:

Como te había comentado, estuve viendo una forma de hacerlo, que quizás no sea la mejor, pero me funciono bien. (No siempre la primera vez es la mejor forma de hacerlo) Ahora solo te queda ver si esto te sirve o puedes/quieres hacerle modificaciones:

Código
  1. static void SplitFiles(string file)
  2.        {
  3.            FileStream loadedFile = new FileStream(file, FileMode.Open);
  4.  
  5.            //Aquí calculamos la primera mitad del archivo analizando si es par o impar la longitud completa.
  6.            //En caso de que sea par le añadimos 1 y sino le añadimos 0 (lo dejamos como va)
  7.            long firstHalfLength = (loadedFile.Length / 2) + ((loadedFile.Length % 2 != 0) ? 1 : 0);
  8.            long secondHalfLength = loadedFile.Length / 2;
  9.  
  10.            //Creamos los bufferes con el tamaño calculado
  11.            byte[] firstHalf = new byte[firstHalfLength];
  12.            byte[] secondHalf = new byte[secondHalfLength];
  13.  
  14.            //Léemos los bytes del FileStream y los pasamos a los bufferes
  15.            loadedFile.Read(firstHalf, 0, firstHalf.Length); //Lees la primera mitad
  16.            loadedFile.Read(secondHalf, 0, secondHalf.Length); //Lees la segunda mitad
  17.  
  18.            loadedFile.Close();
  19.  
  20.            //Creamos los FileStream para los nuevos ficheros y escribimos los bytes en los mismos
  21.            FileStream firstFile = new FileStream("fichero1.part1", FileMode.Create);
  22.            firstFile.Write(firstHalf, 0, firstHalf.Length);
  23.  
  24.            firstFile.Close();
  25.  
  26.            FileStream secondFile = new FileStream("fichero1.part2", FileMode.Create);
  27.            secondFile.Write(secondHalf, 0, secondHalf.Length);
  28.  
  29.            secondFile.Close();
  30.        }
  31.  
  32.        static void JoinFiles(string file1 , string file2)
  33.        {
  34.            //Abrimos los FileStream de los archivos
  35.            FileStream fileStream1 = new FileStream(file1, FileMode.Open);
  36.            FileStream fileStream2 = new FileStream(file2, FileMode.Open);
  37.  
  38.            //Creamos el buffer para los bytes
  39.            byte[] joinedFiles = new byte[fileStream1.Length + fileStream2.Length];
  40.  
  41.            //Leemos la primera mitad del archivo y la guardamos en el buffer nuevo
  42.            fileStream1.Read(joinedFiles, 0, (int)fileStream1.Length);
  43.            //Leemos la segunda mitad del archivo
  44.            fileStream2.Read(joinedFiles, (int)(fileStream1.Length), (int)fileStream2.Length);
  45.  
  46.            fileStream1.Close();
  47.            fileStream2.Close();
  48.  
  49.            //Escribimos el contenido del buffer en el nuevo fichero
  50.            FileStream joinedFileStream = new FileStream("output.jpg", FileMode.Create);
  51.            joinedFileStream.Write(joinedFiles, 0, joinedFiles.Length);
  52.            joinedFileStream.Close();  
  53.        }

Lo hice haciendo dos métodos, uno para picarlo y otro para unirlos. Puedes mejorarlo para que al unirlo puedas identificar que archivos tiene que unir automáticamente al pasarle el nombre del primer archivo.

Una manera de llamarlo sería:

Código
  1. SplitFiles("file.jpg");
  2. JoinFiles("fichero1.part1", "fichero1.Part2");



Añado: Veo que publicaste otro tema sobre lo mismo con algún código. Bueno, cualquier otra duda ya sabes. Pregunta

Salu2s
Veo que publicaste

He intentado hacerlo per ono me sale.

¿Puedes poner el programa completo?

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using System.IO; // No olvidar.
  8.  
  9. namespace Partir_Archivo_2
  10. {
  11.    class Program
  12.    {
  13.        static void Main(string[] args)
  14.        {
  15.  
  16.        }
  17.    }
  18. }
  19.  

Al menos una opción que diga Cortar en dos, y el otro Pegar.

Saludos.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Partir archivo
« Respuesta #8 en: 4 Junio 2015, 23:35 pm »

Aaquí tienes mi solución compelta para partir y unir archivos, eso si, lo desarrollé en VB.Net pero cómo siempre intentaré ayudar con la conversión en C# (conversión online y luego post-modificada por mi, pero no lo he llegado a testear).

Por supuesto lo he desarrollado teniendo en cuenta que sea capaz de partir archivos exactamente a la mitad (teniendo en cuenta que 1 byte es la unidad, por ende, un archivo de 3 bytes no se podrá partir en 2 partes, a menos que adaptes el código fuente para incrementarle 1 byte a una de las dos partes en el buffer de escritura),
si la idea te ha gustado y quieres utilizarla pero no te funciona la traducción a C#, siempre puedes compilar el código original escrito en VB.Net a una librería, y utilizarla desde tu proyecto C#.



Características

Partir archivo en trozos según el tamaño de trozo especificado.
Partir archivo en trozos según la cantidad de trozos especificada.
Unir archivo previamente partido.
Sobreescribir archivos, eliminar restos de archivos...
Eventos para reportar el progreso (porcentajes) de las operaciones de partir y unir.



Modo de empleo

VB.Net:
Código
  1. ''' <summary>
  2. ''' Handles the <see cref="FileSplitter"/> instance.
  3. ''' </summary>
  4. Private WithEvents splitter As New FileSplitter() With {.BufferSize = .BufferSize}
  5.  
  6. ' The file to split.
  7. Private ReadOnly filePath As String = "C:\File.ext"
  8.  
  9. ' Split by chunk size.
  10. Me.splitter.Split(sourceFile:=filePath,
  11.                  chunkSize:=CInt(New IO.FileInfo(filePath).Length / 2),
  12.                  chunkName:="File.Part",
  13.                  chunkExt:="fs",
  14.                  overwrite:=True,
  15.                  deleteAfterSplit:=False)
  16.  
  17. ' Or split by chunk amount.
  18. Me.splitter.Split(sourceFile:=filePath,
  19.                  chunkCount:=2,
  20.                  chunkName:="File.Part",
  21.                  chunkExt:="fs",
  22.                  overwrite:=True,
  23.                  deleteAfterSplit:=True)
  24.  
  25. ''' <summary>
  26. ''' Handles the <see cref="FileSplitter.SplitProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  27. ''' </summary>
  28. ''' <param name="sender">The source of the event.</param>
  29. ''' <param name="e">The <see cref="FileSplitter.SplitProgressChangedArgs"/> instance containing the event data.</param>
  30. Private Sub Splitter_SplitProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.SplitProgressChangedArgs) _
  31. Handles splitter.SplitProgressChanged
  32.  
  33.    labelSplit1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
  34.    labelSplit2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
  35.    labelSplit3.Text = String.Format("Current  Chunk: {0} of {1}", CStr(e.ChunksCreated + 1), CStr(e.ChunksToCreate))
  36.  
  37. End Sub
  38.  
  39. ''' <summary>
  40. ''' Handles the <see cref="FileSplitter.MergeProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  41. ''' </summary>
  42. ''' <param name="sender">The source of the event.</param>
  43. ''' <param name="e">The <see cref="FileSplitter.MergeProgressChangedArgs"/> instance containing the event data.</param>
  44. Private Sub Splitter_MergeProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.MergeProgressChangedArgs) _
  45. Handles splitter.MergeProgressChanged
  46.  
  47.    labelMerge1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
  48.    labelMerge2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
  49.    labelMerge3.Text = String.Format("Current  Chunk: {0} of {1}", CStr(e.ChunksMerged + 1), CStr(e.ChunksToMerge))
  50.  
  51. End Sub

C#:
Código
  1. /// <summary>
  2. /// Handles the <see cref="FileSplitter"/> instance.
  3. /// </summary>
  4. private FileSplitter splitter = new FileSplitter { BufferSize = .BufferSize };
  5.  
  6. // The file to split.
  7. private readonly string filePath = "C:\\File.ext";
  8.  
  9. // Split by chunk size.
  10. this.splitter.Split(sourceFile: filePath,
  11.                    chunkSize: Convert.ToInt32(new IO.FileInfo(filePath).Length / 2),
  12.                    chunkName: "File.Part",
  13.                    chunkExt: "fs",
  14.                    overwrite: true,
  15.                    deleteAfterSplit: false);
  16.  
  17. // Or split by chunk amount.
  18. this.splitter.Split(sourceFile: filePath,
  19.                    chunkCount: 2, chunkName: "File.Part",
  20.                    chunkExt: "fs",
  21.                    overwrite: true,
  22.                    deleteAfterSplit: true);
  23.  
  24. /// <summary>
  25. /// Handles the <see cref="FileSplitter.SplitProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  26. /// </summary>
  27. /// <param name="sender">The source of the event.</param>
  28. /// <param name="e">The <see cref="FileSplitter.SplitProgressChangedArgs"/> instance containing the event data.</param>
  29. private void Splitter_SplitProgressChangedArgs(object sender, FileSplitter.SplitProgressChangedArgs e)
  30. {
  31.  labelSplit1.Text = string.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"));
  32.  labelSplit2.Text = string.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"));
  33.  labelSplit3.Text = string.Format("Current  Chunk: {0} of {1}", Convert.ToString(e.ChunksCreated + 1), Convert.ToString(e.ChunksToCreate));
  34. }
  35.  
  36. /// <summary>
  37. /// Handles the <see cref="FileSplitter.MergeProgressChangedArgs"/> event of the <see cref="Splitter"/> instance.
  38. /// </summary>
  39. /// <param name="sender">The source of the event.</param>
  40. /// <param name="e">The <see cref="FileSplitter.MergeProgressChangedArgs"/> instance containing the event data.</param>
  41. private void Splitter_MergeProgressChangedArgs(object sender, FileSplitter.MergeProgressChangedArgs e)
  42. {
  43.  labelMerge1.Text = string.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"));
  44.  labelMerge2.Text = string.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"));
  45.  labelMerge3.Text = string.Format("Current  Chunk: {0} of {1}", Convert.ToString(e.ChunksMerged + 1), Convert.ToString(e.ChunksToMerge));
  46. }
  47.  
  48. '=======================================================
  49. 'Service provided by Telerik (www.telerik.com)
  50. '=======================================================



Código fuente
VB.Net: http://pastebin.com/kyqkdXZj
C#: http://pastebin.com/DKfCWuw1

Demo Form
VB.Net: http://pastebin.com/BjzEhPdd
C#: http://pastebin.com/Fq0QCJRi




Buen trabajo.

¿Puedes pasarme el proyecto completo?
El correo puedes verlo por aquí.

Me parece un programa muy completo, echo y derecho. ;)

Hay que probarlo.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: Partir archivo
« Respuesta #9 en: 5 Junio 2015, 00:02 am »

¿Puedes pasarme el proyecto completo?

Solo tienes que crear un nuevo proyecto y reemplazar la Class principal (Form1), por esta class, que ya genera los controles del form:

Demo Form
VB.Net: http://pastebin.com/BjzEhPdd

Saludos.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Crear archivo reproducible de DVD a partir de archivo MPG con Canopus ProCoder
Multimedia
aula18 2 5,373 Último mensaje 8 Septiembre 2004, 23:28 pm
por Songoku
Como partir un archivo
Programación Visual Basic
WarGhost 2 1,321 Último mensaje 10 Marzo 2006, 13:00 pm
por Gorky
Partir archivo
.NET (C#, VB.NET, ASP)
Meta 4 3,402 Último mensaje 11 Agosto 2014, 00:05 am
por Meta
Partir archivo con C#
.NET (C#, VB.NET, ASP)
Meta 1 2,075 Último mensaje 25 Mayo 2015, 21:27 pm
por Stakewinner00
Creando un tablero a partir de un archivo « 1 2 »
Programación C/C++
Sothu 17 5,880 Último mensaje 13 Enero 2016, 18:29 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines