Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#6691
Buenas

Primero de nada:

· ¿Que es lo primero que debes hacer antes de acudir a un foro?:
  Acudir al servicio de soporte de la aplicación, al email del autor, para pedirle que implementen la multiple instancia, o pedirle información sobre el tipo de limitación que usaron, o algo que te pueda ayudar, ya que nosotros no somos magos.




Cita de: ambigus9 en 16 Agosto 2014, 22:29 PM¿Alguna sugerencia en particular?

Aparte de que seguramente haya alguna buena razón (ideada por el desarrollador) por la cual limitar la aplicación a 1 única instancia, hay varias formas de llevar a cabo esta limitación, por ejemplo:


  • Usando un MUTEX
  • Comprobando el nombre del proceso en la lista de procesos activos.
  • Comprobando la existencia de un archivo local específico.
  • etc, etc, etc..

Te preguntarás: "¿Y que?", pues que la dificultad de una posible solución varia dependiendo de cual sea la forma que el desarrollador empleó, por ejemplo:

· Si está comprobando el nombre del proceso en la lista de procesos activos:
Con hacer copias del executable y renombrar el nombre de cada archivo sería suficiente.

· Si está comprobando el nombre del proceso en la lista de procesos activos:
Sería suficiente con eliminar el archivo antes de cada inicio de los posteriores procesos.

· Si usó una detección vía MUTEX:
 1. Si quieres una solución temporal deberás isolar el proceso en un espacio virtual (SandBox), por ejemplo con sandboxie.

 2. Otra solución temporal y sin virtualización sería cerrar el/los Handle(s) relacionados con el MUTEX, esto puedes averiguarlo y hacerlo de forma sencilla con la aplicación ProcessExplorer de SysInternals.
  Nota: En caso de ser un ensamblado .NET y que el desarrollador haya implementado la detección por MUTEX desde las opciones de VisualStudio (y no de otra forma más manual), deberás cerrar unos 4 o 5 Handles cuyos nombres contienen las palabras clave "MUTEX" y "BaseNamedObjects".

 3. Si quieres una solución definitiva, creo que haría falta conocimientos de ingenieria inversa para desensamblar la aplicación, buscar la instrucción relacionada con el MUTEX y realizar los cambios necesarios para que permita múltiples instancias.





En fín, cuando desarrollas una aplicación puedes modificarle su identificador único, y la característica principal de una aplicación single-instance es NO permitir más de una instancia de un proceso que tenga el mismo identificador.

Creando un SandBox (como hace la aplicación SandBoxie o cualquier virtualizador de aplicaciones) estarás creando un espacio virtual de memoria donde ejecutar ese proceso de forma aislada al resto, por lo tanto puedes ejecutar la aplicación tanto en el Host como en el SandBox sin que el Identificador de los dos procesos "colisionen", aunque la verdad es que no tengo muy claro el motivo, no se si es que quizás estos programas modifican de alguna manera el contexto del proceso hijo (la app single-instance) para que puedan heredar el identificador del proceso padre (el virtualizador) de alguna manera abstracta o algo parecido, no lo sé, pero claro, si intentas ejecutar la misma aplicación dos veces en el mismo espacio virtual del SandBox... pues pasa lo que ya he explicado, se detecta el MUTEX.





⇲ Documentación:
· Globally unique identifier (GUID)
· Mutual exclusion (MUTEX)

⇲ Utilidades:
· Process Explorer
#6692
.NET (C#, VB.NET, ASP) / Re: Manuales de .NET
16 Agosto 2014, 23:21 PM






⇲ Especificaciones de las características del lenguaje


⇲ Documentación de las características del lenguaje


⇲ Estándares / Adquisición de buenas costumbres


⇲ Tutoriales / Guías


⇲ Video-tutoriales


⇲ Preguntas frecuentes (F.A.Q.)


⇲ Integrated Development Environment (IDE)


⇲ Librería de Classes de .NET Framework


⇲ Windows API / Platform Invoking (P/Invoke)


⇲ Conceptos de programación


⇲ Código fuente / Aplicaciones de código abierto (OpenSource)


⇲ Foro / Soporte / Lugares de ayuda


⇲ Documentación XML


⇲ Visual Studio SDK


⇲ Migración de WinForms a WPF


⇲ Migración de VB6 a VB.Net




#6693
Cita de: Hartwell en 16 Agosto 2014, 22:04 PMY cómo sería el %1 y %2 para reemplazar [url] y [output]?

Me podrías dar un ejemplo por favor.

Arriba te puse el ejemplo mostrándote como se asignarían los argumentos a esas variables... ¿lo has mirado?.

Respecto a las variables especiales %1 y %2 de Batch, porfavor, olvída ese modo de ver las cosas en la programación, de todas formas este es el equivalente:
%1 = WScript.Arguments(0)
%2 = WScript.Arguments(1)


Saludos!
#6694
Cita de: Hartwell en 16 Agosto 2014, 21:33 PMQuisiera saber si es posible ejecutar un vbscript desde cmd utilizando parámetros.

Si, se puede.

Arguments Property (WScript Object)

Código (vb) [Seleccionar]
Set Arguments = WScript.Arguments

If Arguments.Count <> 2 Then
  WScript.Echo "Cantidad de parámetros incorrecta."
  WScript.Quit(1)

Else
  strSource = WScript.Arguments(0)
  strDest = WScript.Arguments(1)
  ' Resto del código aquí...
 
End If


Saludos.
#6695
Cita de: luis456 en 15 Agosto 2014, 21:16 PM04 07 10 13 16 19 22 24 28  ?  <- aca rellenar con un numero dentro del rango 01 al 99 y por supuesto no se repita en la conbinacion esto es cuando se agoten los números de que tenga la variable

1.
¿el número del 1 al 99 del interogante debe ser aleatorio? (ej: ¿daría igual si es 5 o 95?), o por lo contrario debería seguir un orden de incremento (primero el 1, luego en el siguiente interrogante el 2, y en otro interrogante el 3, etc...)

2.
¿el número del interogante debe ser un número del 1 al 99, pero ese número además debe existir dentro de la variable Result? (y, repito lo del punto .1, ¿debe ser aleatorio?)



En teoría supongo que con un For asignándole un Step de 2 e incrementando el valor de una variable que usariamos para especificar el índice del elemento inicial en cada repetición del búcle sería suficiente, pero lo de los interrogantes lo veo algo más complicado, quizás no lo sea tanto, aclárame eso y veré lo que puedo hacer.

Saludos!
#6696
Buenas

Aquí no le hacemos el trabajo a nadie, ayudamos a que aprendas como conseguir hacerlo por ti mismo.

¿Donde está tu código?, muestra tu progreso.

PD: Un detalle que no has aclarado, ¿eso lo quieres hacer en una aplicación CommandLine-Interface?.

Saludos!
#6697
Buenas.

Esta es la mejor, actual, irremplazable, y más completa guía y documentación que existe y que existirá:





Descripción de las características del lenguaje

Documentación y ejemplos de uso de las características del lenguaje

Tutoriales y ejemplos de códigos

Video-tutoriales

Consejos de uso y adquisición de buenas costumbres

Códigos fuente

+

Documentación de la API de Windows






Aparte de todo lo que ofrece MSDN, ¿porque no miras los posts que hay con chincheta en esta sección? (para algo se pusieron arriba del todo, para que la gente no tenga que hacer siempre las mismas preguntas...)
· Manuales de .NET  (Leído 35263 veces)

PD: El tutorial de elguille está muy bien para iniciarse, ya que además de estar en Castellano no exponen la información de manera tan compleja como en algunos aspectos que enseñan en MSDN, pero en mi opinión es mejor aprender a lo hardcore matandose a leer y leer en MSDN, ya que aprenderás más y mejor.

¡Saludos!
#6698
Buenas.

Si ni siquiera explicas como estás moviendo los controles en la UI, no se como esperas que alguien pueda ayudarte a detectar colisiones entre los controles.

1. ¿Que significa para ti "chocar"?, ¿quieres detectar cuando los márgenes de "X" PictureBox colisiona con los de "Y" PictureBox en la interface?.

2. Muestra los event-handlers de tu código (los de los pictureboxes) para saber como los mueves por la UI,
   muestra todo lo demás del código que pueda servir para ayudarte, todo lo que sea código relevante.

Pero sobretodo MUESTRA TU CÓDIGO cuando formules una pregunta que esté relacionada con un código.

Saludos!
#6699
Una Class para cortar y unir archivos al mismo estilo que WinRAR (me refiero a la enumeración de los archivos partidos, este no comprime solo corta).

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author           : Elektro
' Last Modified On : 08-15-2014
' ***********************************************************************
' <copyright file="FileSplitter.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System.ComponentModel
Imports System.IO

#End Region

Public Class FileSplitter

#Region " Properties "

    ''' <summary>
    ''' Gets or sets the buffer-size to split or merge, in Bytes.
    ''' Default value is: 1048576 bytes (1 megabyte).
    ''' </summary>
    ''' <value>The buffer-size.</value>
    Public Property BufferSize As Integer = 1048576I

#End Region

#Region " Events "

#Region " EventHandlers "

    ''' <summary>
    ''' Occurs when the progress changes splitting a file.
    ''' </summary>
    Public Event SplitProgressChanged As EventHandler(Of SplitProgressChangedArgs)

    ''' <summary>
    ''' Occurs when the progress changes merging a file.
    ''' </summary>
    Public Event MergeProgressChanged As EventHandler(Of MergeProgressChangedArgs)

#End Region

#Region " Event Args "

#Region " SplitProgressChanged "

    ''' <summary>
    ''' Contains the Event arguments of the SplitProgressChanged Event.
    ''' </summary>
    Public Class SplitProgressChangedArgs : Inherits EventArgs

#Region " Constructors "

        ''' <summary>
        ''' Prevents a default instance of the <see cref="SplitProgressChangedArgs"/> class from being created.
        ''' </summary>
        Private Sub New()
        End Sub

        ''' <summary>
        ''' Initializes a new instance of the <see cref="SplitProgressChangedArgs"/> class.
        ''' </summary>
        ''' <param name="TotalProgress">The total progress value.</param>
        ''' <param name="ChunkProgress">The current chunk progress value.</param>
        ''' <param name="ChunksToCreate">The amount of chunks to create.</param>
        ''' <param name="ChunksCreated">The amount of created chunks.</param>
        Public Sub New(ByVal TotalProgress As Double,
                       ByVal ChunkProgress As Double,
                       ByVal ChunksToCreate As Integer,
                       ByVal ChunksCreated As Integer)

            Me._TotalProgress = TotalProgress
            Me._ChunkProgress = ChunkProgress
            Me._ChunksToCreate = ChunksToCreate
            Me._ChunksCreated = ChunksCreated

        End Sub

#End Region

#Region " Properties "

        ''' <summary>
        ''' Gets the total progress value.
        ''' (From 0 to 100)
        ''' </summary>
        ''' <value>The total progress value.</value>
        Public ReadOnly Property TotalProgress As Double
            Get
                Return Me._TotalProgress
            End Get
        End Property
        Private _TotalProgress As Double = 0.0R

        ''' <summary>
        ''' Gets the current chunk progress value.
        ''' </summary>
        ''' <value>The current chunk progress value.</value>
        Public ReadOnly Property ChunkProgress As Double
            Get
                Return Me._ChunkProgress
            End Get
        End Property
        Private _ChunkProgress As Double = 0.0R

        ''' <summary>
        ''' Gets the amount of chunks to create.
        ''' </summary>
        ''' <value>The amount of chunks to create.</value>
        Public ReadOnly Property ChunksToCreate As Integer
            Get
                Return Me._ChunksToCreate
            End Get
        End Property
        Private _ChunksToCreate As Integer = 0I

        ''' <summary>
        ''' Gets the amount of created chunks.
        ''' </summary>
        ''' <value>The amount of created chunks.</value>
        Public ReadOnly Property ChunksCreated As Integer
            Get
                Return Me._ChunksCreated
            End Get
        End Property
        Private _ChunksCreated As Integer = 0I

#End Region

#Region " Hidden Methods "

        ''' <summary>
        ''' Serves as a hash function for a particular type.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub GetHashCode()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are considered equal.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub Equals()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are the same instance.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Private Shadows Sub ReferenceEquals()
        End Sub

        ''' <summary>
        ''' Returns a String that represents the current object.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub ToString()
        End Sub

#End Region

    End Class

#End Region

#Region " MergeProgressChangedArgs "

    ''' <summary>
    ''' Contains the Event arguments of the MergeProgressChangedArgs Event.
    ''' </summary>
    Public Class MergeProgressChangedArgs : Inherits EventArgs

#Region " Constructors "

        ''' <summary>
        ''' Prevents a default instance of the <see cref="MergeProgressChangedArgs"/> class from being created.
        ''' </summary>
        Private Sub New()
        End Sub

        ''' <summary>
        ''' Initializes a new instance of the <see cref="MergeProgressChangedArgs"/> class.
        ''' </summary>
        ''' <param name="TotalProgress">The total progress value.</param>
        ''' <param name="ChunkProgress">The current chunk progress value.</param>
        ''' <param name="ChunksToMerge">The amount of chunks to merge.</param>
        ''' <param name="ChunksMerged">The amount of merged chunks.</param>
        Public Sub New(ByVal TotalProgress As Double,
                       ByVal ChunkProgress As Double,
                       ByVal ChunksToMerge As Integer,
                       ByVal ChunksMerged As Integer)

            Me._TotalProgress = TotalProgress
            Me._ChunkProgress = ChunkProgress
            Me._ChunksToMerge = ChunksToMerge
            Me._ChunksMerged = ChunksMerged

        End Sub

#End Region

#Region " Properties "

        ''' <summary>
        ''' Gets the total progress value.
        ''' (From 0 to 100)
        ''' </summary>
        ''' <value>The total progress value.</value>
        Public ReadOnly Property TotalProgress As Double
            Get
                Return Me._TotalProgress
            End Get
        End Property
        Private _TotalProgress As Double = 0.0R

        ''' <summary>
        ''' Gets the current chunk progress value.
        ''' </summary>
        ''' <value>The current chunk progress value.</value>
        Public ReadOnly Property ChunkProgress As Double
            Get
                Return Me._ChunkProgress
            End Get
        End Property
        Private _ChunkProgress As Double = 0.0R

        ''' <summary>
        ''' Gets the amount of chunks to merge.
        ''' </summary>
        ''' <value>The amount of chunks to merge.</value>
        Public ReadOnly Property ChunksToMerge As Integer
            Get
                Return Me._ChunksToMerge
            End Get
        End Property
        Private _ChunksToMerge As Integer = 0I

        ''' <summary>
        ''' Gets the amount of merged chunks.
        ''' </summary>
        ''' <value>The amount of merged chunks.</value>
        Public ReadOnly Property ChunksMerged As Integer
            Get
                Return Me._ChunksMerged
            End Get
        End Property
        Private _ChunksMerged As Integer = 0I

#End Region

#Region " Hidden Methods "

        ''' <summary>
        ''' Serves as a hash function for a particular type.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub GetHashCode()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are considered equal.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub Equals()
        End Sub

        ''' <summary>
        ''' Determines whether the specified System.Object instances are the same instance.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Private Shadows Sub ReferenceEquals()
        End Sub

        ''' <summary>
        ''' Returns a String that represents the current object.
        ''' </summary>
        <EditorBrowsable(EditorBrowsableState.Never)>
        Public Shadows Sub ToString()
        End Sub

#End Region

    End Class

#End Region

#End Region

#End Region

#Region " Hidden Methods "

    ''' <summary>
    ''' Serves as a hash function for a particular type.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub GetHashCode()
    End Sub

    ''' <summary>
    ''' Determines whether the specified System.Object instances are considered equal.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub Equals()
    End Sub

    ''' <summary>
    ''' Determines whether the specified System.Object instances are the same instance.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Private Shadows Sub ReferenceEquals()
    End Sub

    ''' <summary>
    ''' Returns a String that represents the current object.
    ''' </summary>
    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Shadows Sub ToString()
    End Sub

#End Region

#Region " Public Methods "

    ''' <summary>
    ''' Splits the specified file.
    ''' </summary>
    ''' <param name="InputFile">Indicates the file to split.</param>
    ''' <param name="ChunkSize">Indicates the size of each chunk.</param>
    ''' <param name="ChunkName">Indicates the name-format for the chunks.</param>
    ''' <param name="ChunkExt">Indicates the file-extension for the chunks.</param>
    ''' <param name="Overwrite">
    ''' If set to <c>true</c> any existing file will be overwritten if needed to create a chunk,
    ''' otherwise, an exception will be thrown.
    ''' </param>
    ''' <param name="DeleteAfterSplit">If set to <c>true</c> the input file will be deleted after a successful split.</param>
    ''' <exception cref="System.IO.FileNotFoundException">The specified file doesn't exists.</exception>
    ''' <exception cref="System.IO.IOException">File already exists.</exception>
    ''' <exception cref="System.OverflowException">'ChunkSize' should be smaller than the Filesize.</exception>
    Public Sub Split(ByVal InputFile As String,
                     ByVal ChunkSize As Long,
                     Optional ByVal ChunkName As String = Nothing,
                     Optional ByVal ChunkExt As String = Nothing,
                     Optional ByVal Overwrite As Boolean = False,
                     Optional ByVal DeleteAfterSplit As Boolean = False)

        If Not File.Exists(InputFile) Then
            Throw New FileNotFoundException("The specified file doesn't exists.", InputFile)
            Exit Sub
        End If

        ' The progress event arguments.
        Dim ProgressArguments As SplitProgressChangedArgs

        ' FileInfo instance of the input file.
        Dim fInfo As New FileInfo(InputFile)

        ' The total filesize to split, in bytes.
        Dim TotalSize As Long = fInfo.Length

        ' The remaining size to calculate the percentage, in bytes.
        Dim SizeRemaining As Long = TotalSize

        ' Counts the length of the current chunk file to calculate the percentage, in bytes.
        Dim SizeWritten As Long = 0L

        ' The buffer to read data and write the chunks.
        Dim Buffer As Byte() = New Byte() {}

        ' The buffer length.
        Dim BufferLength As Integer = Me.BufferSize

        ' The total amount of chunks to create.
        Dim ChunkCount As Integer = CInt(Math.Floor(fInfo.Length / ChunkSize))

        ' Keeps track of the current chunk.
        Dim ChunkIndex As Integer = 0I

        ' Keeps track of the total percentage done.
        Dim TotalProgress As Double = 0.0R

        ' Keeps track of the current chunk percentage done.
        Dim ChunkProgress As Double = 0.0R

        ' A zero-filled string to enumerate the chunk files.
        Dim Zeros As String = String.Empty

        ' The given filename for each chunk.
        Dim ChunkFile As String = String.Empty

        ' The chunk file basename.
        ChunkName = If(String.IsNullOrEmpty(ChunkName),
                       Path.Combine(fInfo.DirectoryName, Path.GetFileNameWithoutExtension(fInfo.Name)),
                       Path.Combine(fInfo.DirectoryName, ChunkName))

        ' The chunk file extension.
        ChunkExt = If(String.IsNullOrEmpty(ChunkExt),
                      fInfo.Extension.Substring(1I),
                      ChunkExt)

        ' If ChunkSize is bigger than filesize then...
        If ChunkSize >= fInfo.Length Then
            Throw New OverflowException("'ChunkSize' should be smaller than the Filesize.")
            Exit Sub

            ' For cases where a chunksize is smaller than the buffersize.
        ElseIf ChunkSize < BufferLength Then
            BufferLength = CInt(ChunkSize)

        End If ' ChunkSize <>...

        ' If not file-overwrite is allowed then...
        If Not Overwrite Then

            For Index As Integer = 0I To (ChunkCount)

                ' Set chunk filename.
                Zeros = New String("0", CStr(ChunkCount).Length - CStr(Index + 1I).Length)
                ChunkFile = String.Format("{0}.{1}.{2}", ChunkName, Zeros & CStr(Index + 1I), ChunkExt)

                ' If chunk file already exists then...
                If File.Exists(ChunkFile) Then

                    Throw New IOException(String.Format("File already exists: {0}", ChunkFile))
                    Exit Sub

                End If ' File.Exists(ChunkFile)

            Next Index

            Zeros = String.Empty
            ChunkFile = String.Empty

        End If ' Overwrite

        ' Open the file to start reading bytes.
        Using InputStream As New FileStream(fInfo.FullName, FileMode.Open)

            Using BinaryReader As New BinaryReader(InputStream)

                While (InputStream.Position < InputStream.Length)

                    ' Set chunk filename.
                    Zeros = New String("0", CStr(ChunkCount).Length - CStr(ChunkIndex + 1I).Length)
                    ChunkFile = String.Format("{0}.{1}.{2}", ChunkName, Zeros & CStr(ChunkIndex + 1I), ChunkExt)

                    ' Reset written byte-length counter.
                    SizeWritten = 0L


                    ' Create the chunk file to Write the bytes.
                    Using OutputStream As New FileStream(ChunkFile, FileMode.Create)

                        Using BinaryWriter As New BinaryWriter(OutputStream)

                            ' Read until reached the end-bytes of the input file.
                            While (SizeWritten < ChunkSize) AndAlso (InputStream.Position < InputStream.Length)

                                ' Read bytes from the original file (BufferSize byte-length).
                                Buffer = BinaryReader.ReadBytes(BufferLength)

                                ' Write those bytes in the chunk file.
                                BinaryWriter.Write(Buffer)

                                ' Increment the bytes-written counter.
                                SizeWritten += Buffer.Count

                                ' Decrease the bytes-remaining counter.
                                SizeRemaining -= Buffer.Count

                                ' Set the total progress.
                                TotalProgress = (TotalSize - SizeRemaining) * (100I / TotalSize)

                                ' Set the current chunk progress.
                                ChunkProgress =
                                    If(Not ChunkIndex = ChunkCount,
                                       (100I / ChunkSize) * (SizeWritten - BufferLength),
                                       (100I / (InputStream.Length - (ChunkSize * ChunkIndex))) * (SizeWritten - BufferLength))

                                ' Set the progress event-arguments.
                                ProgressArguments =
                                    New SplitProgressChangedArgs(
                                        TotalProgress:=If(Not TotalProgress > 99.9R, TotalProgress, 99.9R),
                                        ChunkProgress:=ChunkProgress,
                                        ChunksToCreate:=ChunkCount + 1I,
                                        ChunksCreated:=ChunkIndex)

                                ' Report the progress event-arguments.
                                RaiseEvent SplitProgressChanged(Me, ProgressArguments)

                            End While ' (SizeWritten < ChunkSize) AndAlso (InputStream.Position < InputStream.Length)

                            OutputStream.Flush()

                        End Using ' BinaryWriter

                    End Using ' OutputStream

                    ChunkIndex += 1I 'Increment the chunk file counter.

                End While ' InputStream.Position < InputStream.Length

            End Using ' BinaryReader

        End Using ' InputStream

        ' Set the progress event-arguments.
        ProgressArguments =
            New SplitProgressChangedArgs(
                TotalProgress:=100.0R,
                ChunkProgress:=100.0R,
                ChunksToCreate:=ChunkCount + 1I,
                ChunksCreated:=ChunkIndex)

        ' Report the progress event-arguments.
        RaiseEvent SplitProgressChanged(Me, ProgressArguments)

    End Sub

    ''' <summary>
    ''' Merges the specified file.
    ''' </summary>
    ''' <param name="InputFile">
    ''' Indicates the file to merge its chunks.
    ''' This should be the first chunk file (eg: 'File.Part.01.mkv')
    ''' </param>
    ''' <param name="OutputFile">Indicates the output file.</param>
    ''' <param name="Overwrite">
    ''' If set to <c>true</c>, in case that the 'OutputFile' exists it will be overwritten,
    ''' otherwise, an exception will be thrown.
    ''' </param>
    ''' <param name="DeleteChunksAfterMerged">
    ''' If set to <c>true</c>, the chunks will be deleted after a successful.
    ''' </param>
    ''' <exception cref="System.IO.FileNotFoundException">The specified file doesn't exists.</exception>
    ''' <exception cref="System.IO.IOException">File already exists.</exception>
    ''' <exception cref="System.Exception">The last chunk file is missing.</exception>
    ''' <exception cref="System.Exception">Unexpected chunk filesize-count detected.</exception>
    Public Sub Merge(ByVal InputFile As String,
                     Optional ByVal OutputFile As String = Nothing,
                     Optional ByVal Overwrite As Boolean = False,
                     Optional DeleteChunksAfterMerged As Boolean = False)

        If Not File.Exists(InputFile) Then
            Throw New FileNotFoundException("The specified file doesn't exists.", InputFile)
            Exit Sub

        ElseIf Not Overwrite AndAlso File.Exists(OutputFile) Then
            Throw New IOException(String.Format("File already exists: {0}", OutputFile))
            Exit Sub

        End If

        ' The progress event arguments.
        Dim ProgressArguments As MergeProgressChangedArgs

        ' FileInfo instance of the input chunk file.
        Dim fInfo As New FileInfo(InputFile)

        ' Get the filename without extension.
        Dim Filename As String = Path.GetFileNameWithoutExtension(fInfo.FullName)
        ' Remove the chunk enumeration from the filename.
        Filename = Filename.Substring(0I, Filename.LastIndexOf("."c))

        ' TSet the pattern to find the chunk files to merge.
        Dim ChunkPatternSearch As String =
            Filename & ".*" & If(Not String.IsNullOrEmpty(fInfo.Extension), fInfo.Extension, "")

        ' Retrieve all the chunk files to merge them.
        Dim Chunks As IEnumerable(Of FileInfo) =
           From Chunk As String In
           Directory.GetFiles(fInfo.DirectoryName, ChunkPatternSearch, SearchOption.TopDirectoryOnly)
           Select New FileInfo(Chunk)

        If Chunks.Count < 2I Then ' If chunk files are less than 2 then...
            Throw New Exception("The last chunk file is missing.")
            Exit Sub
        End If

        ' The total filesize to merge, in bytes.
        Dim TotalSize As Long =
            (From Chunk As FileInfo In Chunks Select Chunk.Length).Sum

        ' Gets the filesize of the chunk files and the last chunk file, in bytes.
        Dim ChunkSizes As Long() =
            (From Chunk As FileInfo In Chunks
             Select Chunk.Length Order By Length Descending
            ).Distinct.ToArray

        If ChunkSizes.Count > 2I Then ' If chunk sizes are more than 2...
            Throw New Exception("Unexpected chunk filesize-count detected.")
            Exit Sub
        End If

        ' The remaining size to calculate the percentage, in bytes.
        Dim SizeRemaining As Long = TotalSize

        ' Counts the length of the current chunk file to calculate the percentage, in bytes.
        Dim SizeWritten As Long = 0L

        ' Counts the length of the written size on the current chunk file, in bytes.
        Dim ChunkSizeWritten As Long = 0L

        ' The buffer to read data and merge the chunks.
        Dim Buffer As Byte() = New Byte() {}

        ' The buffer length.
        Dim BufferLength As Integer = Me.BufferSize

        ' The total amount of chunks to merge.
        Dim ChunkCount As Integer = Chunks.Count

        ' Keeps track of the current chunk.
        Dim ChunkIndex As Integer = 0I

        ' Keeps track of the total percentage done.
        Dim TotalProgress As Double = 0.0R

        ' Create the output file to merge the chunks inside.
        Using OutputStream As New FileStream(OutputFile, FileMode.Create)

            Using BinaryWriter As New BinaryWriter(OutputStream)

                ' Iterate the chunks.
                For Each Chunk As FileInfo In Chunks

                    ' Open the chunk to start reading bytes.
                    Using InputStream As New FileStream(Chunk.FullName, FileMode.Open)

                        Using BinaryReader As New BinaryReader(InputStream)

                            ' Read until reached the end-bytes of the chunk file.
                            While (InputStream.Position < InputStream.Length)

                                ' Read bytes from the chunk file (BufferSize byte-length).
                                Buffer = BinaryReader.ReadBytes(BufferLength)

                                ' Write those bytes in the output file.
                                BinaryWriter.Write(Buffer)

                                ' Increment the bytes-written counters.
                                SizeWritten += Buffer.Count
                                ChunkSizeWritten += Buffer.Count

                                ' Decrease the bytes-remaining counter.
                                SizeRemaining -= Buffer.Count

                                ' Set the total progress.
                                TotalProgress = (TotalSize - SizeRemaining) * (100I / TotalSize)

                                ' Set the progress event-arguments.
                                ProgressArguments = New MergeProgressChangedArgs(
                                    TotalProgress:=If(Not TotalProgress > 99.9R, TotalProgress, 99.9R),
                                    ChunkProgress:=(100I / InputStream.Length) * (ChunkSizeWritten - BufferLength),
                                    ChunksToMerge:=ChunkCount,
                                    ChunksMerged:=ChunkIndex)

                                ' Report the progress.
                                RaiseEvent MergeProgressChanged(Me, ProgressArguments)

                            End While ' (InputStream.Position < InputStream.Length)

                            ChunkIndex += 1I ' Increment the chunk file counter.
                            ChunkSizeWritten = 0L ' Reset the bytes-written for the next chunk.

                        End Using ' BinaryReader

                    End Using ' InputStream

                Next Chunk

                OutputStream.Flush()

            End Using ' BinaryWriter

        End Using ' OutputStream

        ' Set the progress event-arguments.
        ProgressArguments = New MergeProgressChangedArgs(
            TotalProgress:=100.0R,
            ChunkProgress:=100.0R,
            ChunksToMerge:=ChunkCount,
            ChunksMerged:=ChunkIndex)

        ' Report the progress.
        RaiseEvent MergeProgressChanged(Me, ProgressArguments)

        If DeleteChunksAfterMerged Then ' Delethe the chunk files.

            For Each Chunk As FileInfo In Chunks
                File.Delete(Chunk.FullName)
            Next Chunk

        End If ' DeleteChunksAfterMerged

    End Sub

#End Region

End Class



Ejemplo de uso:



Código (vbnet) [Seleccionar]
Public Class FileSplitter_Test

   ' Some Sizes to choose.
   Private ReadOnly Megabyte As Integer = 1048576I
   Private ReadOnly Gigabyte As Integer = 1073741824I

   ' The controls that will report the progress.
   Private LabelSplit1, LabelSplit2, LabelSplit3 As New Label
   Private LabelMerge1, LabelMerge2, LabelMerge3 As New Label

   ' The controls to split or merge.
   Private WithEvents ButtonSplit, ButtonMerge As New Button

   ' The FileSplitter instance.
   Private WithEvents Splitter As New FileSplitter() With
       {
         .BufferSize = (Megabyte * 10I)
       } ' With BufferSize of 10 Megabytes.

   Public Sub New()

       ' This call is required by the designer.
       InitializeComponent()

       ' Set the Form properties.
       With Me
           .Size = New Point(400, 200)
           .FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
           .MaximizeBox = False
       End With

       ' Set the control properties.
       With ButtonSplit
           .Text = "Split"
           .Font = New Font(Me.Font.FontFamily, 14.0F, FontStyle.Bold)
           .Size = New Point(200I, 75I)
           .Location = New Point(0I, 0I)
           .Cursor = Cursors.Hand
       End With

       With ButtonMerge
           .Text = "Merge"
           .Font = New Font(Me.Font.FontFamily, 14.0F, FontStyle.Bold)
           .Size = New Point(200I, 75I)
           .Location = New Point(ButtonSplit.Location.X + ButtonSplit.Width, 0I)
           .Cursor = Cursors.Hand
       End With

       With LabelSplit1
           .Text = "Total Progress:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(0I, ButtonSplit.Location.Y + ButtonSplit.Height + 10I)
       End With

       With LabelSplit2
           .Text = "Chunk Progress:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(0I, LabelSplit1.Location.Y + LabelSplit1.Height)
       End With

       With LabelSplit3
           .Text = "Chunk Count:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(0I, LabelSplit2.Location.Y + LabelSplit2.Height)
       End With

       With LabelMerge1
           .Text = "Total Progress:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(ButtonMerge.Location.X, ButtonMerge.Location.Y + ButtonMerge.Height + 10I)
       End With

       With LabelMerge2
           .Text = "Chunk Progress:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(ButtonMerge.Location.X, LabelMerge1.Location.Y + LabelMerge1.Height)
       End With

       With LabelMerge3
           .Text = "Chunk Count:"
           .AutoSize = True
           .Font = New Font(Me.Font.FontFamily, 9.0F, FontStyle.Regular)
           .Location = New Point(ButtonMerge.Location.X, LabelMerge2.Location.Y + LabelMerge2.Height)
       End With

       ' Add the controls into the form.
       Me.Controls.AddRange({LabelSplit1, LabelSplit2, LabelSplit3})
       Me.Controls.AddRange({LabelMerge1, LabelMerge2, LabelMerge3})
       Me.Controls.AddRange({ButtonSplit, ButtonMerge})

   End Sub

   ''' <summary>
   ''' Handles the 'Click' event of the 'ButtonSplit' control.
   ''' </summary>
   Private Sub ButtonSplit_Click() Handles ButtonSplit.Click

       Splitter.Split(InputFile:="C:\File.mkv",
                      ChunkSize:=Gigabyte,
                      ChunkName:="File.Part",
                      ChunkExt:="fs",
                      Overwrite:=True,
                      DeleteAfterSplit:=False)

   End Sub

   ''' <summary>
   ''' Handles the 'Click' event of the 'ButtonMerge' control.
   ''' </summary>
   Private Sub ButtonMerge_Click() Handles ButtonMerge.Click

       Splitter.Merge(InputFile:="C:\File.Part.1.fs",
                      OutputFile:="C:\Merged.mkv",
                      Overwrite:=True,
                      DeleteChunksAfterMerged:=True)

   End Sub

   ''' <summary>
   ''' Handles the 'SplitProgressChangedArgs' event of the 'Splitter' object.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="FileSplitter.SplitProgressChangedArgs"/> instance containing the event data.</param>
   Private Sub Splitter_SplitProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.SplitProgressChangedArgs) _
   Handles Splitter.SplitProgressChanged

       LabelSplit1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
       LabelSplit2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
       LabelSplit3.Text = String.Format("Chunk Count: {0} of {1}", CStr(e.ChunksCreated), CStr(e.ChunksToCreate))
       Application.DoEvents()

   End Sub

   ''' <summary>
   ''' Handles the 'MergeProgressChangedArgs' event of the 'Splitter' object.
   ''' </summary>
   ''' <param name="sender">The source of the event.</param>
   ''' <param name="e">The <see cref="FileSplitter.MergeProgressChangedArgs"/> instance containing the event data.</param>
   Private Sub Splitter_MergeProgressChangedArgs(ByVal sender As Object, ByVal e As FileSplitter.MergeProgressChangedArgs) _
   Handles Splitter.MergeProgressChanged

       LabelMerge1.Text = String.Format("Total Progress: {0}%", e.TotalProgress.ToString("n1"))
       LabelMerge2.Text = String.Format("Chunk Progress: {0}%", e.ChunkProgress.ToString("n1"))
       LabelMerge3.Text = String.Format("Chunk Count: {0} of {1}", CStr(e.ChunksMerged), CStr(e.ChunksToMerge))
       Application.DoEvents()

   End Sub

End Class
#6700
Foro Libre / Re: Textaloud
15 Agosto 2014, 00:03 AM
Cita de: Waxy en 14 Agosto 2014, 23:30 PMhe buscado hasta por debajo de las piedras

...Hasta debajo de las piedras no has buscado, se sincero, esta situación tan tópica me fastidia mucho.

La primera página de resultados que muestra Google está plagada de voces y de información acerca de las voces adicionales que existen,
en todos y cada uno de los resultados tienes algo, incluyendo Torrents con semillas para su descarga:
· https://www.google.com/search?q=textaloud+voices&ie=utf-8&oe=utf-8&lr=lang_en&gws_rd=ssl

Y la información acerca de las voces Yankees adicionales aparecen en la página oficial del programa (¿donde iba a ser sino?), que además es el primer resultado de Google.

Acapela™

Citar
Indian English    Deepa
US English    Micah    
US English    Saul    
US English    Will    
US English    Heather    
US English    Kenny    
US English    Laura    
US English    Nelly    
US English    Ryan    
US English    Tracy    
US English    Rod - NEW    
US English    Karen - NEW

AT&T Natural Voices™

CitarEnglish - Great Britain    Audrey
English - Great Britain    Charles
English - India            Anjali
English - United States    Mike
English - United States    Crystal
English - United States    Julia
English - United States    Lauren
English - United States    Mel
English - United States    Ray
English - United States    Rich
English - United States    Claire

Nuance Vocalizer™

CitarEnglish - Australia       Karen    
English - Australia       Lee    
English - Great Britain    Daniel    
English - Great Britain    Serena    
English - Great Britain    Emily    
English - India          Veena - NEW    
English - India          Sangeeta    
English - Ireland          Moira    
English - Scotland          Fiona    
English - South Africa       Tessa - NEW    
English - United States    Allison - NEW    
English - United States    Ava - NEW    
English - United States    Samantha    
English - United States    Tom    
English - United States    Jennifer    
English - United States    Jill

Nota: En la página specifican que todos los packs son compatibles con TextAloud.

Si no quieres comprar un pack de voces y prefieres probar el producto antes de adquirirlo (ya sabes, este foro y sus usuarios son legales), puedes buscar en Google (buscar de verdad) o usar motores de búsqueda de Torrents:
· http://kickass.to/torrents/usearch/?q=AT%26T+Natural+Voices


PD:
Tiempo que he invertido aproximadamente para buscar y encontrar: 20 segundos


¡Saludos!