Jump to content
Pedro Pinheiro

_FileListToArray Dúvida.

Recommended Posts

Eu queria listar uns arquivos contido em uma pasta, mas sempre que eu executo a função ele me retorna o nome completo do arquivo + local do arquivo + extensão do arquivo com o _FileListToArray.

 

 

Me aprofundei no help e achei isso. Ele faz uma lista com os arquivos de uma pasta e faz com que só mostre o nome do arquivo. Ex: "Arquivo.zip", mas não consegui esconder a extensão do arquivo.

Local $aFileList= _FileListToArrayRec(@ScriptDir & "\roms", "*.zip", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_SORT,$FLTAR_NOPATH)
 _ArrayDisplay( $aFileList, "Sorted tree")

LXTyDH0.png

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

Olha, isso não responde a sua pergunta, mas como não encontrei outra forma, vou deixar aqui como alternativa, até encontrarmos uma maneira melhor

 

#include <Array.au3> ; Only required to display the arrays
#include <File.au3>
#include <MsgBoxConstants.au3>
 
Example()
 
Func Example()
    Local $sAutoItDir = StringLeft(@AutoItExe, StringInStr(@AutoItExe, "\", Default, -1)),$sDrive = "", $sDir = "", $sFileName = "", $sExtension = "",$aPathSplit, $aArray
    If StringRight($sAutoItDir, 5) = "beta\" Then
        $sAutoItDir = StringTrimRight($sAutoItDir, 5)
    EndIf
    ConsoleWrite($sAutoItDir & @CRLF)
 
 
    $aArray = _FileListToArrayRec($sAutoItDir, "*.au3", $FLTAR_FILESFOLDERS, $FLTAR_RECUR,   $FLTAR_NOPATH)
	
 
	For $vElement In $aArray
        $aPathSplit = _PathSplit($vElement, $sDrive, $sDir, $sFileName, $sExtension)
		ConsoleWrite($sFileName & @CRLF);somente o nome do arquivo
    Next
 
EndFunc 
Obs: faz uns anos ai que trabalho com autoit então estou bem por fora dos codes kkkk

Edited by joelson0007
  • Like 2

Share this post


Link to post
Share on other sites

Olha se ajuda...

se não for usar a função _ArrayDisplay pode remover a include <File.au3>.

#include <File.au3>

Local $aFileList= __FileListToArray("D:\ROMS", "*.zip")
 _ArrayDisplay( $aFileList, "Sorted tree")

 ; #FUNCTION# ====================================================================================================================
; Author ........: Michael Michta
; Modified.......: guinness - Added optional parameter to return the full path.
; ===============================================================================================================================
Func __FileListToArray($sFilePath, $sFilter)
	Local $sDelimiter = "|", $sFileList = "", $sFileName = "", $iFlag = 1

	; Check parameters for the Default keyword or they meet a certain criteria
	$sFilePath = StringRegExpReplace($sFilePath, "[\\/]+$", "") & "\" ; Ensure a single trailing backslash

	; Check if the directory exists
	If Not FileExists($sFilePath) Then Return SetError(1, 0, 0)
	If StringRegExp($sFilter, "[\\/:><\|]|(?s)^\s*$") Then Return SetError(2, 0, 0)
	If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 0, 0)
	Local $hSearch = FileFindFirstFile($sFilePath & $sFilter)
	If @error Then Return SetError(4, 0, 0)
	While 1
		$sFileName = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		If ($iFlag + @extended = 2) Then ContinueLoop
		$sFileList &= $sDelimiter & StringTrimRight($sFileName, 4)
	WEnd
	FileClose($hSearch)
	If $sFileList = "" Then Return SetError(4, 0, 0)
	Return StringSplit(StringTrimLeft($sFileList, 1), $sDelimiter)
EndFunc   ;==>__FileListToArray

Apenas fiz algumas alterações na função _FileListToArray, basta indicar a pasta com os arquivos e o filtro, *.zip, *.7z... etc...

  • Like 2

Share this post


Link to post
Share on other sites

Boa @mutleey, essa sua resposta ficou melhor, pois evita o loop extra ali nos arquivos.

 

corrigindo.

 

Obs: faz uns anos ai que "NÃO" trabalho com autoit então estou bem por fora dos codes kkkk

Edited by joelson0007

Share this post


Link to post
Share on other sites

@Pedro pinheiro estranho vc falar que o _FileListToArray() retorna o caminho completo pois aqui só mostra os arquivos encontrados na pasta aí basta tirar a extensão com o StringTrimRight()

 

EXEMPLO:

#include <File.au3>
#include <Array.au3>
#include <String.au3>

$pasta = FileSelectFolder("Procurando pasta.", "")
lista_arq($pasta, ".a3c")

Func lista_arq($pasta = "", $ext = ".zip")
	Local $arquivos, $tira_ext, $guarda, $listados
	$arquivos = _FileListToArray($pasta, "*" & $ext)
	$conta_arq = UBound($arquivos)
	$conta_arq -= 1
	If Not @error Then
		For $i = 1 To $conta_arq
			$tira_ext = StringTrimRight($arquivos[$i], 4)
			$guarda &= $tira_ext & "|"
		Next
	EndIf
	$listados = _StringExplode($guarda, "|", 0)
	_ArraySort($listados)
	_ArrayDisplay($listados)
EndFunc   ;==>lista_arq
Edited by Belini

Share this post


Link to post
Share on other sites

Boa @mutleey, essa sua resposta ficou melhor, pois evita o loop extra ali nos arquivos.

 

corrigindo.

 

Obs: faz uns anos ai que "NÃO" trabalho com autoit então estou bem por fora dos codes kkkk

as vezes usando alguma udf preciso de "algo a mais" ai faço uma copia da mesma e modifico para o proposito, valeu joelson0007

Share this post


Link to post
Share on other sites

@Belini.

 

O _FileListToArray pra mim retorna o caminho todo "C:/rom/jogo.zip", só que eu usei o " _FileListToArrayRec", nele eu defino vário tipos de retorno...

_FileListToArrayRec("C:\roms", "*.zip", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_SORT,$FLTAR_NOPATH)

EDITADO:

 

Achei o porque. Se deixar em False ele só retorna o nome do arquivo.

_FileListToArray("C:\SCRIPTS AUTOIT\FRONT END WARLOCK\roms", "*.zip", $FLTA_FILESFOLDERS   , False)
Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

A versão que eu uso do Autoit não tem estes 2 últimos parâmetros e vai só até onde determina a extenão que vai procurar e o default da função só mostra o arquivo sem o caminho completo!

Share this post


Link to post
Share on other sites

Uma dúvida. Existe alguma forma de modificar os elementos do _FileListToArrayRec??

 

Por exemplo...Se o arquivo encontrado no _FileListToArrayRec seja Kof94.zip, então que ele seja listado com "The King of fighters 94.zip"? Estou tendo problemas com a listagem em ordem alfabética.

 

Ex do que está acontecendo...A sequencia não bate com a ordem alfabética. Preciso alterar o valor na _FileListToArrayRec.

 

Eu fiz um sistema onde se o arquivo encontrado for kof97.zip, então ao invés de ser listado "kof97.zip", ele seria listado como The king of fighters 97.zip, mas isso fora do _FileListToArrayRec. Creio eu se isso fosse modificado dentro do _FileListToArrayRec, então ele manteria a ordem alfabética.

$aFileList= _FileListToArrayRec(@ScriptDir & "\roms", "*.zip", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_SORT,$FLTAR_NOPATH)
$lst=IniRead($Lista_games, "kof97.zip", "Nome", $aFileList[4])

GUICtrlSetData($gui4, $lst)

$gui1  kof94.zip
$gui2  kof95.zip
$gui3  kof96.zip
$gui4  The King of Fighters '97 (set 1)
$gui5  kof98.zip

Se não encontrar a seção "Kof97´.zip", então usar o nome verdadeiro do arquivo listado na pasta "Kof97.zip"

list.ini

[kof96.zip]
Nome=The King of Fighters '96
[kof97.zip] 
Nome=The King of Fighters '97
[kof98.zip]
Nome=The King of Fighters '98

 

 

Entenderam? Eu pego o valor da lista e jogo para o Label e listo ele mantendo a ordem alfabética do _FileListToArrayRec, mas quando eu renomeio o valor listado. O The king fica ná listagem "K" de kof97...Eu precisaria fazer uma comparação, renomear e criar outra lista em ordem alfabética.

 

É difícil de explicar isso, até eu me confundi.

 

É basicamente listar todos arquivos da pasta, compará-los as seções do lista.ini, renomear na lista todos os que possuem nomes no lista.ini e criar outra lista com ordem alfabética. Queria uma luz ou alguma ideia sobre isso. Porque bati em uma parede dura aqui.

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

@pedro pinheiro vc pode pode colocar as informações de cada jogo separadas por "|" e para separar a informação de um do outro pode usar o "#" ai para cada jogo vc inicia com o nome completo depois do "|" coloca o nome da rom depois usa o _StringExplode() para separar o que está dividido com o "#" e para colocar em ordem alfabética use o _ArraySort() assim ficará tudo em ordem alfabetica pelo nome completo e com o nome da rom em segundo lugar após o "|"

Edited by Belini

Share this post


Link to post
Share on other sites

porque vc não usa o própio lst do advmenu?

Pensei na mesma coisa, inclusive foi ele que eu usei ele pra criar o meu em arquivo .ini!

Edited by Belini

Share this post


Link to post
Share on other sites

usa isso...

em anexo esta o .lst do advmenu.

#include <String.au3>

$file = FileOpen(@ScriptDir & "\Arcade.lst", 0)
$readxml = FileRead($file)

$rom_name = _StringBetween($readxml, 'game ( name ', ' description')
$description = _StringBetween($readxml, 'description "', '" year')

$max = UBound($rom_name) - 1
For $linha = 1 To $max
	FileWriteLine("Lista.ini", '[' & $linha & ']')
	FileWriteLine("Lista.ini", 'Game=' & $rom_name[$linha])
	FileWriteLine("Lista.ini", 'Nome=' & $description[$linha])
	FileWriteLine("Lista.ini", '')
Next

Arcade.zip

Edited by mutleey
  • Like 1

Share this post


Link to post
Share on other sites

 

usa isso...

em anexo esta o .lst do advmenu.

#include <String.au3>

$file = FileOpen(@ScriptDir & "\Arcade.lst", 0)
$readxml = FileRead($file)

$rom_name = _StringBetween($readxml, 'game ( name ', ' description')
$description = _StringBetween($readxml, 'description "', '" year')

$max = UBound($rom_name) - 1
For $linha = 1 To $max
	FileWriteLine("Lista.ini", '[' & $linha & ']')
	FileWriteLine("Lista.ini", 'Game=' & $rom_name[$linha])
	FileWriteLine("Lista.ini", 'Nome=' & $description[$linha])
	FileWriteLine("Lista.ini", '')
Next

 

 

Vou montar um script. Mais Fácil.

#include <Array.au3>
#include <GUIConstants.au3>
#include <File.au3>
Local $game_list[0]
   $itens_menu=5
   $posicion=13
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $RECUO=0

$aFileList= _FileListToArrayRec("C:\SCRIPTS AUTOIT\FRONT END WARLOCK\roms", "*.zip", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_SORT,$FLTAR_NOPATH)



GUICreate("Janela", 400, 300)


Local $MeusLabels[0]


	For $count = 1 to $itens_menu-1
      $lst=IniRead("C:\SCRIPTS AUTOIT\FRONT END WARLOCK\lista.ini", StringTrimRight($aFileList[$count],4), "Nome", StringTrimRight($aFileList[$count],0))
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($lst,  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)

 while 1
WEnd

lista.ini

[1941j]
Nome=1941 - Counter Attack (Japan)

[1942]
Nome=1942 (set 1)

[1942a]
Nome=1942 (set 2)

Dentro da pasta Rom vc cria 4 roms ".zip"

 

1942a.zip

1942.zip

1941j.zip

1941r1.zip

 

 

 

DC0LBFh.png

Se ele não encontrar o arquivo no Lista.ini, então ele usará o nome do arquivo original. No caso ele não achou no lista.ini o nome do 1941.zip. Só que nessas alterações de nome a ordem alfabética está se perdendo. Fiz isso para basear a lista na existência das roms da pasta.

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites
On 06/08/2016 at 12:05 PM, Pedro Pinheiro said:

 

 

Vou montar um script. Mais Fácil.


#include <Array.au3>
#include <GUIConstants.au3>
#include <File.au3>
Local $game_list[0]
   $itens_menu=5
   $posicion=13
   $count=1
   $espaco_inicial=0
   $espaco_entre=40
   $RECUO=0

$aFileList= _FileListToArrayRec("C:\SCRIPTS AUTOIT\FRONT END WARLOCK\roms", "*.zip", $FLTAR_FILES, $FLTAR_NORECUR, $FLTAR_SORT,$FLTAR_NOPATH)



GUICreate("Janela", 400, 300)


Local $MeusLabels[0]


	For $count = 1 to $itens_menu-1
      $lst=IniRead("C:\SCRIPTS AUTOIT\FRONT END WARLOCK\lista.ini", StringTrimRight($aFileList[$count],4), "Nome", StringTrimRight($aFileList[$count],0))
      _ArrayAdd($MeusLabels, GUICtrlCreateLabel($lst,  $RECUO, $posicion+$espaco_inicial, 309, 30))
      $espaco_inicial+=$espaco_entre
   Next
   GUISetState(@SW_SHOW)

 while 1
WEnd

lista.ini


[1941j]
Nome=1941 - Counter Attack (Japan)

[1942]
Nome=1942 (set 1)

[1942a]
Nome=1942 (set 2)

Dentro da pasta Rom vc cria 4 roms ".zip"

 

1942a.zip

1942.zip

1941j.zip

1941r1.zip

 

 

 

DC0LBFh.png

Se ele não encontrar o arquivo no Lista.ini, então ele usará o nome do arquivo original. No caso ele não achou no lista.ini o nome do 1941.zip. Só que nessas alterações de nome a ordem alfabética está se perdendo. Fiz isso para basear a lista na existência das roms da pasta.

pedro e esse esquema que quero fazer para abri as imaguens de boot ao precionar o botao aparecer uma lista assim com os arquivos.png dentro da pasta

Share this post


Link to post
Share on other sites
50 minutes ago, michel almeida said:

pedro e esse esquema que quero fazer para abri as imaguens de boot ao precionar o botao aparecer uma lista assim com os arquivos.png dentro da pasta

Da uma olhada aqui 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×