Operaciones con Archivos Topic is solved

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Operaciones con Archivos

Post by BlackDraGoN » 14 Nov 2022, 04:04

Me gustaría saber como puedo leer el contenido de 2 directorios y almacenar la lista de archivos en una matriz cada directorio, que luego comparare ambas para mover o eliminar ciertos archivos.

Las funciones de mover y copiar ya se como funcionan, pero estoy un poco perdido en como crear 2 matrices con los nombres de todos los archivos de cada directorio.

Gracias.

Lepes
Posts: 141
Joined: 06 May 2021, 07:32
Location: Spain

Re: Operaciones con Archivos

Post by Lepes » 14 Nov 2022, 04:41

En la ayuda de LoopFile tienes varios ejemplos:

Code: Select all

FileList := ""  ; Initialize to be blank.
Loop, C:\*.*
    FileList .= A_LoopFileName "`n"  ; TRUCO: le añade un salto de linea a cada fichero encontrado, para después poder usar "Loop, parse" y cortar por los saltos de línea añadidos.
Sort, FileList, R  ; The R option sorts in reverse order. See Sort for other options.
Loop, parse, FileList, `n
{
    if (A_LoopField = "")  ; Ignore the blank item at the end of the list.
        continue
    MsgBox, 4,, File number %A_Index% is %A_LoopField%.  Continue?
    IfMsgBox, No
        break
} 
Aquí por ejemplo ordena los ficheros alfabéticamente, algo imprescindible para poder comparar de forma ordenada.

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Operaciones con Archivos

Post by BlackDraGoN » 14 Nov 2022, 05:20

Lepes wrote:
14 Nov 2022, 04:41
En la ayuda de LoopFile tienes varios ejemplos:

Code: Select all

FileList := ""  ; Initialize to be blank.
Loop, C:\*.*
    FileList .= A_LoopFileName "`n"  ; TRUCO: le añade un salto de linea a cada fichero encontrado, para después poder usar "Loop, parse" y cortar por los saltos de línea añadidos.
Sort, FileList, R  ; The R option sorts in reverse order. See Sort for other options.
Loop, parse, FileList, `n
{
    if (A_LoopField = "")  ; Ignore the blank item at the end of the list.
        continue
    MsgBox, 4,, File number %A_Index% is %A_LoopField%.  Continue?
    IfMsgBox, No
        break
} 
Aquí por ejemplo ordena los ficheros alfabéticamente, algo imprescindible para poder comparar de forma ordenada.
Como puedo crear una matriz con los nombre de los archivos ordenados??? Necesito crear 2 matrices globales donde esten los nombres de los archivos y asi poder usarlos en procesos diferentes.

Muchas Gracias.

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Operaciones con Archivos

Post by sofista » 14 Nov 2022, 09:01

Hola: Una manera de hacerlo, rápida y directamente, es cargar los nombres de los archivos en un array asociativo, con lo cual queda asegurado que el orden alfabético. Ejemplo:

Code: Select all

dict := {}

Loop, C:\*.*
	if !dict.haskey(A_LoopFileName)
		dict[A_LoopFileName] := 1

For k, v in dict
	MsgBox, % "El archivo número " A_Index " es " k

return

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Operaciones con Archivos

Post by BlackDraGoN » 14 Nov 2022, 10:29

@sofista

Code: Select all

Directorio1 := {}
Directorio1 := ListDir('C:\*.*')

ListDir (Ruta)
{
	Filelist := {}
	Loop, Ruta
		if !Filelist.haskey(A_LoopFileName)
			Filelist[A_LoopFileName] := 1

	Return FileList
}
Esto seria correcto asi??

Por cierto, hay alguna forma de obtener el nombre del fichero pero sin la extension??

Muchas Gracias

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Operaciones con Archivos  Topic is solved

Post by sofista » 14 Nov 2022, 13:24

Tu código está bastante bien, pero subsisten algunos problemitas que corrijo y comento:

Code: Select all

;Directorio1 := {}                ; innecesario, el array se crea con la devolución de la función ListDir
Directorio1 := ListDir("C:\*.*")  ; comillas dobles para la ruta, con las simples no compila

For k, v in Directorio1           ; sólo para visualizar individualmente los ítems del array
	MsgBox, % "El archivo número " A_Index " es " k

ListDir(Ruta) {                   ; no debe haber separación entre el nombre de la función y los parámetros
	Filelist := {}
	Loop, % Ruta {                                     ; "Ruta" es una variable, hay que pasarla al modo [c]expression[/c] para que no sea leída literalmente
		SplitPath, A_LoopFileName,,,, FileNameNoExt    ; se elimina la extensión con el comando SplitPath, según lo solicitado
		if !Filelist.haskey(FileNameNoExt)
			Filelist[FileNameNoExt] := 1
	}

	Return FileList
}
Ahora bien, cuando se elimina la extensión de los nombres de los archivos, se crea el problema potencial entre dos o más archivos con el mismo nombre pero distinta extensión. Por caso, en la función ListDir se ignora el o los posibles duplicados.

Eso es todo :)

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Operaciones con Archivos

Post by BlackDraGoN » 15 Nov 2022, 03:10

@sofista

Muchisimas gracias por tu ayuda. :bravo: :bravo: :bravo:

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Operaciones con Archivos

Post by sofista » 15 Nov 2022, 09:56

Me alegro de que este asunto esté encaminado :)

Y como suelo decir, cuando uno se encuentra con dificultades de código, lo más recomendable es guiarse por la documentación del lenguaje.

Suerte!

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Operaciones con Archivos

Post by BlackDraGoN » 17 Nov 2022, 10:45

@sofista

Code: Select all

C1 :={}
For k, v in A1 
{
	if !B1.haskey(k)
		C1[k.v] := 1
}
En k tengo una parte de un nombre y en v la otra parte, como puedo hacer para que me cree el valor de la combinación de las variables pasadas.

Muchas Gracias

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Operaciones con Archivos

Post by sofista » 17 Nov 2022, 13:56

Casi bien :) Para evitar ambigüedades, el punto de concatenación requiere espacios que lo separen de los ítems a concatenar.

Code: Select all

C1 := {}
A1 := { 1:1, 2:2, 3:3, 4:4, 5:5 }

For k, v in A1 {
	if !B1.haskey(k)
		C1[k . v] := 1    ; o también puede omitirse el punto, dejando un espacio: C1[k v] := 1
}

For k, v in C1
	MsgBox, % k

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Operaciones con Archivos

Post by BlackDraGoN » 18 Nov 2022, 15:39

Estoy haciendo pruebas con el array asociativo, y tengo una pregunta. He usado el array, pero ahora quiero limpiarlo para poder realizar otras comprobaciones, como puedo ponerlo de nuevo en blanco, he puesto C1 :={} pero sigo teniendo los valores antiguos.

Gracias de antemano @sofista

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Operaciones con Archivos

Post by sofista » 18 Nov 2022, 17:18

Te diría que publiques el código, porque lo que dices no está bien. Ejemplo:

Code: Select all

C1 := { 1:1, 2:2, 3:3, 4:4, 5:5 }
MsgBox, % C1.Length()    ; 5
C1 := {}    ; o también C1 := ""
MsgBox, % C1.Length()    ; 0
En el primer caso, C1 consta de 5 elementos, en el segundo, ninguno.

Post Reply

Return to “Pedir Ayuda”