Что нового

Получения списка файла из каталога

forfrends

Новичок
Сообщения
176
Репутация
3
Друзья, помогите.
У меня есть масса файлов формата ".txt"
мне их надо открыть, изменить, и полученную информацию записать в другой файл. Но это все я сам сделаю.
Проблема вот в чем: я незнаю как получить список всех файлов в папке, что бы потом можно было открывать поочередно все файлы из списка и работать с ними.
Поиск по форуму почти ничего не дал - почти ничего не нашел, а что нашел - не понял как с этим работать.
Если можно - по подродней описать сам процесс спасибо!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
forfrends,
Из справки:
Код:
#Include <File.au3>
_FileListToArray($sPath [, $sFilter = "*" [, $iFlag = 0]])


Или подробнее:
Код:
#include <File.au3>
#include <Array.au3>
;получаем список всех файлов с расширением .txt в папке MyFolder в текущей папке.
$aFiles = _FileListToArray(@ScriptDir & '\MyFolder', '*.txt', 1)
_ArrayDisplay($aFiles)
For $i = 1 To $aFiles[0]
	;в цикле по очереди, например, открываем файл,
	$hFileTemp = FileOpen(@ScriptDir & '\MyFolder\' & $aFiles[$i], 0)
	;читаем,
	$sTextTemp = FileRead($hFileTemp)
	;закрываем.
	FileClose($hFileTemp)
	;или делаем то, что нам надо.
Next
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Если нет необходимости в одновременном доступе ко всем файлам можно использовать функции FileFindFirstFile и FileFindNextFile напрямую.

Пример из справки:

Код:
; Shows the filenames of all files in the current directory.
$hSearch = FileFindFirstFile(@ScriptDir & '\MyFolder\*.txt')  

; Check if the search was successful
If $hSearch = -1 Then
    MsgBox(0, 'Error', 'No files/directories matched the search pattern')
    Exit
EndIf

While 1
    $sFile = FileFindNextFile($hSearch) 
    If @error Then ExitLoop
    
    MsgBox(4096, 'File:', $sFile)
WEnd

; Close the search handle
FileClose($hSearch)
 

Alexander

Новичок
Сообщения
105
Репутация
2
Ситуация такая:
Вот собрался переустанавливать систему, и естественно нужно потом устанавливать драйвера. Так вот, я подумал, что это не удобно делать с десятками дисков)))
Вот хочу все файлы диска с драйвером всунуть в один exe. В программе будут кнопки, соответствующие каждому драйверу. При нажатии на кнопку извлекаются файлы (FileInstall) определенного драйвера в папку Temp. Потом запускается установка(RunWait), я устанавливаю драйвер, когда установилось, эта папка удаляется с Temp(для того и RunWait). Но не в этом суть. На диске очень много папок и файлов, а мне нужно ввести каждый для распаковки. Но не буду же я делать это вручную. Так вот хочу спросить, как получить список всех файлов в папке примерно такого вида:
Папка1\Папка2\1.txt
Папка1\Папка2\2.txt
Папка1\2.txt
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Alexander
не изобретай велосипед. Для этого есть уже готовые инструменты. Driver Magician например
 

Alexander

Новичок
Сообщения
105
Репутация
2
Не хочу я пользоваться утилитами, я хочу все сделать сам :IL_AutoIt_1:
Мне только это нужно:
Так вот хочу спросить, как получить список всех файлов в папке примерно такого вида:
Папка1\Папка2\1.txt
Папка1\Папка2\2.txt
Папка1\2.txt
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Alexander [?]
как получить список всех файлов в папке примерно такого вида:
Папка1\Папка2\1.txt
Папка1\Папка2\2.txt
Папка1\2.txt
Попробуйте так:
Код:
#include <Array.au3>

$aReturn = _FileSearch(@DesktopDir, '*.txt', 1)
_ArrayDisplay($aReturn)

Func _FileSearch($sPath, $sFileMask = '*', $iFlag = 0)
	;фильтры для поиска нужно указывать через ;
	;$iFlag = 0 - Файлы и папки (по умолчанию)
	;$iFlag = 1 - Только файлы
	;$iFlag = 2 - Только папки
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib
	Switch $iFlag
		Case 1
			$sAttrib = ' /A-D'
		Case 2
			$sAttrib = ' /AD'
		Case Else
			$sAttrib = ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		$hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
		While 1
			$sRead = StdoutRead($hDir, False, True)
			If @error Then
				ExitLoop
			EndIf
			If $sRead <> "" Then
				$sOut &= $sRead
			EndIf
		WEnd
	Next
	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
	If @error Then
		Return SetError(1)
	EndIf
	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

Alexander

Новичок
Сообщения
105
Репутация
2
madmasles
Yashied

Спасибо! А как теперь сделать, чтоб каждый результат вставлялся так: DirCreate('результат') и т.д. и записывалось в txt файл. Но чтоб как в этом скрипте можно было включать опцию "поиск файлов", "поиск папок", "поиск папок и файлов".
*'результат' без пути до папки
Например:
@DesktopDir & '\Драйвера...'
C:\Documents and Settings\Admin\Рабочий стол\Драйвера...
заменить при отображении на:
DirCreate(@TempDir (так и отобразить) & '\Драйвера...')

PS. Все, уже не нужно, сделал сам :IL_AutoIt_1:
 

Bingo888

Новичок
Сообщения
36
Репутация
0
forfrends,
Из справки:
Код:
#Include <File.au3>
_FileListToArray($sPath [, $sFilter = "*" [, $iFlag = 0]])


Или подробнее:
Код:
#include <File.au3>
#include <Array.au3>
;получаем список всех файлов с расширением .txt в папке MyFolder в текущей папке.
$aFiles = _FileListToArray(@ScriptDir & '\MyFolder', '*.txt', 1)
_ArrayDisplay($aFiles)
For $i = 1 To $aFiles[0]
    ;в цикле по очереди, например, открываем файл,
    $hFileTemp = FileOpen(@ScriptDir & '\MyFolder\' & $aFiles[$i], 0)
    ;читаем,
    $sTextTemp = FileRead($hFileTemp)
    ;закрываем.
    FileClose($hFileTemp)
    ;или делаем то, что нам надо.
Next
forfrends,
Из справки:
Код:
#Include <File.au3>
_FileListToArray($sPath [, $sFilter = "*" [, $iFlag = 0]])


Или подробнее:
Код:
#include <File.au3>
#include <Array.au3>
;получаем список всех файлов с расширением .txt в папке MyFolder в текущей папке.
$aFiles = _FileListToArray(@ScriptDir & '\MyFolder', '*.txt', 1)
_ArrayDisplay($aFiles)
For $i = 1 To $aFiles[0]
    ;в цикле по очереди, например, открываем файл,
    $hFileTemp = FileOpen(@ScriptDir & '\MyFolder\' & $aFiles[$i], 0)
    ;читаем,
    $sTextTemp = FileRead($hFileTemp)
    ;закрываем.
    FileClose($hFileTemp)
    ;или делаем то, что нам надо.
Next
Сообщение автоматически объединено:

Добрый день! Подскажите, написал скрип котрый по очереди открывает файлы в папке и сохраняет нужные даные в файл. Проблема заключается в том что незнаю как правильно написать чтоб програмка не создавала новый файл а дозаписывала новые строки в текущий уже созданный файл.
Вот мой код:

#include <Array.au3> ;подключаем
#include <Excel.au3>
#include <File.au3>

$aFiles = _FileListToArray(@ScriptDir & '\in', '*.csv', 1)


For $i =1 To $aFiles[0]
$hFileTemp = FileOpen(@ScriptDir & '\in\' & $aFiles[$i], 0)
$String = FileRead($hFileTemp) ;читаем


$sFilePath1 = @ScriptDir & "\result1.xls"

$HFILL = StringRegExp($String, '(?s)<HFILL>(.*?)</HFILL>', 3)
$HTIN = StringRegExp($String, '(?s)<HTIN>(.*?)</HTIN>', 3)
$HNAME = StringRegExp($String, '(?s)<HNAME>(.*?)</HNAME>', 3)
$HBOS = StringRegExp($String, '(?s)<HBOS>(.*?)</HBOS>', 3)
$H01G1S = StringRegExp($String, '(?s)<H01G1S>(.*?)</H01G1S>', 3)
$HTINSTI = StringRegExp($String, '(?s)<HTINSTI>(.*?)</HTINSTI>', 3)
$HSTI = StringRegExp($String, '(?s)<HSTI>(.*?)</HSTI>', 3)
$HLOCSTI = StringRegExp($String, '(?s)<HLOCSTI>(.*?)</HLOCSTI>', 3)
$HEMAIL = StringRegExp($String, '(?s)<HEMAIL>(.*?)</HEMAIL>', 3);вытягиваем

Local $aResult[1000][9]
$aResult[0][0] = 'Дата формування'
$aResult[0][1] = 'ЄД'
$aResult[0][2] = 'НАЗВА '
$aResult[0][3] = 'ПІБ '
$aResult[0][4] = 'ДІЄ '
$aResult[0][5] = 'ЄДР'
$aResult[0][6] = 'НАЗВА '
$aResult[0][7] = 'ПОСИЛАННЯ '
$aResult[0][8] = 'ЕМЕІЛ'

$aResult [1][0] = $HFILL[0]
$aResult [1][1] = $HTIN[0]
$aResult [1][2] = $HNAME[0]
$aResult [1][3] = $HBOS[0]
$aResult [1][4] = $H01G1S[0]
$aResult [1][5] = $HTINSTI[0]
$aResult [1][6] = $HSTI [0]
$aResult [1][7] = $HLOCSTI[0]
$aResult [1][8] = $HEMAIL[0]


$oExcel = _Excel_Open(True)
$oWorkbook = _Excel_BookNew($oExcel)
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aResult)
_Excel_BookSaveAs($oWorkbook, $sFilePath1[$i])
_Excel_BookClose($oWorkbook)
_Excel_Close($oExcel)

Next
 
Последнее редактирование:
Верх