Shell   27-04-2023, 12:17
#1
Buenas!.

El tiempo que tarda la copia total la vimos hace ya tiempo en un ejemplo con la barra de progreso.

Código:
Public Sub Copiar()
 
  Dim aarchivos As New String[]  
  Dim unarchivo As String
  Dim incrementos As Float
 
  comienzo = Timer
 
  aarchivos.Clear
  ProgressBar1.Value = 0
 
  aarchivos = RDir(directoriorigen, "*", gb.File)
  incrementos = 1 / aarchivos.Count
  For Each unarchivo In aarchivos
    ProgressBar1.Value += incrementos
    lblStatus.Text = "Copiando " & unarchivo    
    Wait 0.01     
    ' Para copiar, descomentar
    ' Copy directoriorigen &/ unarchivo To directoriodestino &/ unarchivo
  Next
  diferenciadetiempo = Timer - comienzo  
  Message.Info("Copia completada" & gb.NewLine & "El tiempo que ha tardado en copiar los archivos es: " & Format(diferenciadetiempo, "-#.##") & "s")
 
  Me.Close
 
End

Pero, ¿ cómo calcularíamos la velocidad en tiempo real de la copia de "x" archivos ?.

En Gambas tenemos la posibilidad de saber cuanto mide un archivo mediante el comando Stat.

Código:
Public Sub Main()

  Dim rutaarchivo As String
 
  'Uso un nombre de archivo que tengo en el disco
  rutaarchivo = User.Home &/ "001 The Present Simple of to be.mp3"
 
  With Stat(rutaarchivo)    
    Print "Tamaño de archivo: " & Round(.Size / 1024); "K"
    Print "Tamaño de archivo: " & Round(.Size / 1024 ^ 2); "M"
  End With
 

End

Salida:
Cita: 
Tamaño de archivo: 4458K
Tamaño de archivo: 4M

Imaginar que tenemos 10 archivos iguales como ese. ( Eso puede ser lo más fácil )

Cada vez que termina la copia de uno de esos archivos, ha pasado un tiempo y se ha transferido una cantidad de información.
Cada vez que escribe 4458K en el disco se acaba una copia, tenemos cuando comenzó y cuando terminó y vuelve a repetirse el proceso.

comienzo = Timer
diferenciadetiempo = Timer - comienzo

Es tamaño / tiempo si no recuerdo mal.

En el caso de un archivo si ha tardado 0.25 segundos y su tamaño es 4M, su velocidad podía haber sido:

4M / 0.25 = 16M/s ¿ No ?.

Eso sería lo que tarda en copiarse un archivo.  Como son archivos iguales pues sería sencillo de calcular.
Ahora lo interesante sería de que los archivos fueran de distinto tamaño.

Entonce supongo que por la formula anterior iríamos sumando los tiempos que tarda cada copia y dividiríamos por la media del número de archivos.
Eso supongo que es lo que debe mostrarse en el progresos de la copia.

¿ Ustedes que opinan ?. Tranquis el mundo va a seguir ahí. Wink

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   27-04-2023, 21:59
#2
No tengo ni las más remota idea de como medir el tiempo, pero no creo que valga tu fórmula, ya que supongo que dependerá de la velocidad de escritura/lectura del dispositivo. Es decir, no es lo mismo un disco SSD que uno mecánico, que un USB 2.1 que un USB 3.0. También dependerá de las tareas que está haciendo el ordenador en ese momento, si la CPU está muy ocupada supongo que la escritura será más lenta. No debe ser fácil. Recuerdo que cuando usaba Windows los tiempos que marcaba el administrador de archivos variaban desde unos segundos hasta unas cuantas horas en el mismo proceso de copiado.

Un saludo.
cogier   28-04-2023, 17:14
#3
Pruebe este código en una nueva aplicación gráfica. Lo siento, pero está en inglés.

[Imagen: FileSize.png]

Código:
GridView1 As Gridview
HBox1 As HBox
ButtonCopy As Button
ButtonClose As Button
Spring1 As Spring
sPathFrom As String = User.Home &/ "Downloads" ''Change to the desired folder - Cambiar a la carpeta deseada
sPath As String = "/tmp/XXCopyTestXX" ''THIS FOLDER WILL BE DELETED - ESTA CARPETA SERÁ ELIMINADA

Public Sub Form_Open()

  RemoveFiles
  BuildForm

End

Public Sub ButtonCopy_Click()

  Dim sFileList As String[] = Dir(sPathFrom, "*", gb.File)
  Dim fFileStartTimes, fFileFinishTimes As New Float[]
  Dim dFileDiff As New Date[]
  Dim lFileSize As New Long[]
  Dim fStart, fFinish As Float

  If Not Exist(sPath) Then Mkdir sPath

  For iLoop As Integer = 0 To sFileList.Max
    fStart = CFloat(Time())
    fFileStartTimes.Add(fStart)
    Copy sPathFrom &/ sFileList[iLoop] To sPath &/ sFileList[iLoop]
    fFinish = CFloat(Time())
    lFileSize.Add(Stat(sPath &/ sFileList[iLoop]).Size)
    fFileFinishTimes.Add(fFinish)
    dFileDiff.Add(fFinish - fStart)
    Me.Title = ("Copying file ") & Str(iLoop + 1) & (" of ") & Str(sFileList.Count)
  Next

  Me.Title = Application.Name

  For iLoop = 0 To sFileList.Max
    Inc GridView1.Rows.Count
    GridView1[iLoop, 0].Text = sFileList[iLoop]
    GridView1[iLoop, 0].Alignment = Align.Left
    GridView1[iLoop, 1].Text = CStr(fFileStartTimes[iLoop])
    GridView1[iLoop, 1].Alignment = Align.Left
    GridView1[iLoop, 2].Text = CStr(fFileFinishTimes[iLoop])
    GridView1[iLoop, 2].Alignment = Align.Left
    GridView1[iLoop, 3].Text = Format(dFileDiff[iLoop], "nn:ss:uu")
    GridView1[iLoop, 3].Alignment = Align.Left
    GridView1[iLoop, 4].Text = Str(lFileSize[iLoop] / 1000000) & " MB - (" & Format(lFileSize[iLoop] / 1000000, "0.00 MB)")
    GridView1[iLoop, 4].Alignment = Align.Right
  Next

  GridView1.Columns.Width = -1

End

Public Sub ButtonClose_Click()

  RemoveFiles
  Me.Close

End

Public Sub RemoveFiles()

  Dim sFile As String

  If Exist(sPath) Then

    For Each sFile In Dir(sPath)
      Kill sPath &/ sFile
    Next

    Rmdir sPath

  End If

End

Public Sub BuildForm()

  Dim sTitle As String[] = [("File"), ("Start"), ("Stop"), ("Time taken\nmm:ss:uu"), ("Size")]

  With Me
    .H = 750
    .W = 1000
    .Arrangement = Arrange.Vertical
    .Padding = 5
  End With

  With GridView1 = New GridView(Me) As "GridView1"
    .Columns.Count = 5
    .Rows.Count = 0
    .Header = GridView.Both
    .Expand = True
  End With

  For iLoop As Integer = 0 To 4
    GridView1.Columns[iLoop].Title = sTitle[iLoop]
    GridView1.Columns[iLoop].Alignment = Align.Center
  Next

  With HBox1 = New HBox(Me)
    .H = 28
    .W = 800
  End With

  With ButtonClose = New Button(HBox1) As "ButtonClose"
    .Text = ("Clo&se")
    .W = 100
    .H = 28
  End With

  Spring1 = New Spring(HBox1)

  With ButtonCopy = New Button(HBox1) As "ButtonCopy"
    .Text = ("&Copy")
    .W = 100
    .H = 28
  End With

End
Shell   01-05-2023, 23:52
#4
(27-04-2023, 21:59)guizans escribió: No tengo ni las más remota idea de como medir el tiempo, pero no creo que valga tu fórmula, ya que supongo que dependerá de la velocidad de escritura/lectura del dispositivo. Es decir, no es lo mismo un disco SSD que uno mecánico, que un USB 2.1 que un USB 3.0. También dependerá de las tareas que está haciendo el ordenador en ese momento, si la CPU está muy ocupada supongo que la escritura será más lenta. No debe ser fácil. Recuerdo que cuando usaba Windows los tiempos que marcaba el administrador de archivos variaban desde unos segundos hasta unas cuantas horas en el mismo proceso de copiado.

Naturalmente , los dispositivos son los dispositivos e influyen.
Pero una caja de dialogo que muestra una copia de un archivo solo hace eso, copiar y muestra el valor en la barra de progreso ( que en realidad sea
fiable esa velocidad es otra cuestión ). El proceso se va a realizar tanto si tienes un cd, un disco duro, como un disquete. Wink

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.