Operaciones con Archivos Topic is solved
Moderator: Flipeador
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Operaciones con Archivos
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.
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.
Re: Operaciones con Archivos
En la ayuda de LoopFile tienes varios ejemplos:
Aquí por ejemplo ordena los ficheros alfabéticamente, algo imprescindible para poder comparar de forma ordenada.
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
}
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Re: Operaciones con Archivos
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.Lepes wrote: ↑14 Nov 2022, 04:41En la ayuda de LoopFile tienes varios ejemplos:
Aquí por ejemplo ordena los ficheros alfabéticamente, algo imprescindible para poder comparar de forma ordenada.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 }
Muchas Gracias.
Re: Operaciones con Archivos
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
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Re: Operaciones con Archivos
@sofista
Esto seria correcto asi??
Por cierto, hay alguna forma de obtener el nombre del fichero pero sin la extension??
Muchas Gracias
Code: Select all
Directorio1 := {}
Directorio1 := ListDir('C:\*.*')
ListDir (Ruta)
{
Filelist := {}
Loop, Ruta
if !Filelist.haskey(A_LoopFileName)
Filelist[A_LoopFileName] := 1
Return FileList
}
Por cierto, hay alguna forma de obtener el nombre del fichero pero sin la extension??
Muchas Gracias
Re: Operaciones con Archivos Topic is solved
Tu código está bastante bien, pero subsisten algunos problemitas que corrijo y comento:
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
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
}
Eso es todo
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Re: Operaciones con Archivos
@sofista
Muchisimas gracias por tu ayuda.
Muchisimas gracias por tu ayuda.
Re: Operaciones con Archivos
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!
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!
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Re: Operaciones con Archivos
@sofista
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
Code: Select all
C1 :={}
For k, v in A1
{
if !B1.haskey(k)
C1[k.v] := 1
}
Muchas Gracias
Re: Operaciones con Archivos
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
-
- Posts: 39
- Joined: 13 Nov 2022, 09:31
Re: Operaciones con Archivos
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
Gracias de antemano @sofista
Re: Operaciones con Archivos
Te diría que publiques el código, porque lo que dices no está bien. Ejemplo:
En el primer caso, C1 consta de 5 elementos, en el segundo, ninguno.
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