Показать полную графическую версию : текстовый файл с именами всех файлов в папке
Помогите пожалуйста составить код, который перечисляет в текстовом файле все файлы указанных папок.
То есть папок например может быть указано и три и семь.
madmasles
03-02-2012, 11:20
все файлы указанных папок »Указанных где? Все файлы с учетом подпапок или только самих папок? В текстовый файл писать только имена файлов или полные пути?
madmasles, указанных в самом скрипте.
Если можно, то пример с учетом подпапок и без учета.
То есть я например указываю $Dir1 с учетом, $Dir2 без учета.
Круто было бы если полный путь!
madmasles
03-02-2012, 12:57
socap,
$Dir = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & '\AutoIt'
$aFilesAll = _FileSearch($Dir, '*', 1);с учетом подпапок
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(16, 'Error', '_FileSearch')
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sText = 'С учетом подпапок' & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'Папка: ' & $Dir & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'Всего файлов: ' & $aFilesAll[0] & _
@CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'На ' & @MDAY (http://www.autoitscript.com/autoit3/docs/macros.htm#@mday) & '.' & @MON (http://www.autoitscript.com/autoit3/docs/macros.htm#@mon) & '.' & @YEAR (http://www.autoitscript.com/autoit3/docs/macros.htm#@year) & ' ' & @HOUR (http://www.autoitscript.com/autoit3/docs/macros.htm#@hour) & ':' & @MIN (http://www.autoitscript.com/autoit3/docs/macros.htm#@min) & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFilesAll[0]
$sText &= $i & '. ' & $aFilesAll[$i] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & '\FilesAll.txt', 2)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile, StringTrimRight (http://www.autoitscript.com/autoit3/docs/functions/StringTrimRight.htm)($sText, 2))
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)
$aFiles = _FileSearch($Dir, '*', 1, 0);без учета подпапок
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(16, 'Error', '_FileSearch')
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sText = 'Без учета подпапок' & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'Папка: ' & $Dir & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'Всего файлов: ' & $aFiles[0] & _
@CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'На ' & @MDAY (http://www.autoitscript.com/autoit3/docs/macros.htm#@mday) & '.' & @MON (http://www.autoitscript.com/autoit3/docs/macros.htm#@mon) & '.' & @YEAR (http://www.autoitscript.com/autoit3/docs/macros.htm#@year) & ' ' & @HOUR (http://www.autoitscript.com/autoit3/docs/macros.htm#@hour) & ':' & @MIN (http://www.autoitscript.com/autoit3/docs/macros.htm#@min) & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFiles[0]
$sText &= $i & '. ' & $Dir & '\' & $aFiles[$i] & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & '\Files.txt', 2)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile, StringTrimRight (http://www.autoitscript.com/autoit3/docs/functions/StringTrimRight.htm)($sText, 2))
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
;CreatoR; http://autoit-script.ru/index.php/topic,8266.msg55775
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)(FileGetAttrib (http://www.autoitscript.com/autoit3/docs/functions/FileGetAttrib.htm)($sPath), "D") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iSubDir = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sAttrib &= ' /S'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iSort = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sAttrib &= ' /O:N'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $iFlag
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 1
$sAttrib &= ' /A-D'
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) 2
$sAttrib &= ' /AD'
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$sAttrib &= ' /A'
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
$sOut = StringToBinary (http://www.autoitscript.com/autoit3/docs/functions/StringToBinary.htm)('0' & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf), 2)
$sPath = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sPath, '\\+$', '')
$sFileMask = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sFileMask, '^;+|;+$', '')
$sFileMask = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sFileMask, ';{2,}', ';')
$aMasks = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)($sFileMask, ';')
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aMasks[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($aMasks[$i], 8) = "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $i < $aMasks[0] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sFiles &= ';'
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$hDir = Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)(@ComSpec (http://www.autoitscript.com/autoit3/docs/macros.htm#@comspec) & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@systemdir), @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@sw_hide), 6)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$sRead = StdoutRead (http://www.autoitscript.com/autoit3/docs/functions/StdoutRead.htm)($hDir, False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False), True (http://www.autoitscript.com/autoit3/docs/keywords.htm#True))
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sRead <> "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sOut &= $sRead
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(10)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
$aOut = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)(BinaryToString (http://www.autoitscript.com/autoit3/docs/functions/BinaryToString.htm)($sOut, 2), '[^\r\n]+', 3)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aOut) < 2 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(2, 0, 0)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$aOut[0] = UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($aOut) - 1
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aOut
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc) ;==>_FileSearch
apozlevich
03-02-2012, 21:08
Помогите пожалуйста составить код, который перечисляет в текстовом файле все файлы указанных папок.
То есть папок например может быть указано и три и семь. »
Фигассе вы заморочились. Есть же команда dir, которая с аргументом /B выводит только имена. Кстати, madmasles именно ее в итоге и использует в коде.
Спасибо! А как сделать так чтобы можно было ввести в скрипт например имя нескольких папок и все они были в этом текстовом файле?
Вот так еще можно
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <File.au3>
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <RecFileListToArray.au3>
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $Dir[20]
$Dir[0] = "c:\Program Files\AutoIt3"
$Dir[1] = "c:\Windows"
$Dir[2] = "c:\Temp"
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://www.autoitscript.com/autoit3/docs/functions/UBound.htm)($Dir) - 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $Dir[$i] = "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
_Search($Dir[$i], 0)
_Search($Dir[$i], 1)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _Search($Dir, $iRecursion)
$aFiles = _RecFileListToArray($Dir, "*.*", 1, $iRecursion, 0, 2, "", "")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) IsArray (http://www.autoitscript.com/autoit3/docs/functions/IsArray.htm)($aFiles) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(16, "Error", "Invalid input path"& @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & $Dir)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iRecursion = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & "\NoRecursion.txt",1)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@scriptdir) & "\Recursion.txt",1)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
_FileWriteFromArray (http://dundats.mvps.org/help/html/libfunctions/_filewritefromarray.htm)($hFile, $aFiles, 1)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Udf брать здесь (http://www.autoitscript.com/forum/index.php?app=core&module=attach§ion=attach&attach_id=35567) и положить в Autoit3\Include
socap, до кучи
#Include <FileOperations.au3>
$FileList=_FO_FileSearch(@WindowsDir, '*', True, 125, 1, 0)&@CRLF
$FileList &=_FO_FileSearch(@UserProfileDir, '*', True, 125, 1, 0)&@CRLF
$FileList &=_FO_FileSearch(@ProgramFilesDir&'\Internet Explorer', '*', True, 125, 1, 0)
$file = FileOpen(@ScriptDir&'\file.txt',2)
FileWrite($file, $FileList)
FileClose($file)
Только надо скачать это (http://u.to/Wf6NAQ) и положить файл FileOperations.au3 в папку "C:\Program Files\AutoIt3\Include"
apozlevich
16-02-2012, 12:15
Так чем вам не нравится использование dir /B?
apozlevich
16-02-2012, 12:36
Тогда надо использовать прямой доступ к секторам диска, вот это труъ труъ
apozlevich
1. сравни скорость
2. Сравни вывод. dir /B при маске "*.doc" выведет файлы "*.docx", а оно надо, для этого я введу "*.doc?" или "*.doc*" если это понадобится.
apozlevich
16-02-2012, 13:16
AZJIO, *.doc не выведет .docx, маска "*.doc" означает "все, что заканчивается на .doc" и .docx к этому не подходит. Кстати, у топикстартера нет задачи вывести по маске.
Скорость? Я даже моргнуть не успел, а dir уже отработал. Зато насколько меньше кода...
вот
http://autoit-script.ru/index.php/topic,5259.0.html
я уже сталкивался с чем-то подобным... посмотри может пригодится...
Я периодически использую (немного видоизмененную под свои нужды)
AZJlO
Такой лаконичный код, спасибо.
Но не работает маска по расширениям почему-то.
#Include <FileOperations.au3>
$FileList =_FO_FileSearch('d:\Misc\', 'exe|jpg|png', True, 125, 1, 0)&@CRLF
;$FileList &=_FO_FileSearch('', '*', True, 125, 1, 0)&@CRLF
$FileList &=_FO_FileSearch('c:\windows', 'exe|jpg|png', True, 125, 1, 0)
$file = FileOpen(@ScriptDir&'\file.txt',2)
FileWrite($file, $FileList)
FileClose($file)
Выдает файл.тхт с двумя пустыми строчками.
socap, должен работать, просто по умолчанию маска является полной, типа '*.exe|*.jpg|*.png', что позволяет использовать маску к примеру '*.in?|*.htm*|*.doc*'. Если необходимо использовать маску 'exe|jpg|png', то нужно указать параметр $iTypeMask=2 или $iTypeMask=0. Если что справка есть в самом UDF или здесь (http://forum.oszone.net/post-1857391.html#post1857391) с подробным объяснением всех параметров, а они очень интересные (исключение/уровень вложенности/вид результата).
Там с UDF идёт в комплекте Gui, чтоб поиграть с параметрами. Вставляй путь, выбирай маску и смотри вывод.
AZJIO, а можно ли сделать маску исключения файлов по папкам?
То есть указываешь большую директорию (с кучей файлов и подпапок), исключаешь пару папок и файлы из исключенных папок в поиск не попадают?
И можно ли сделать маску по размеру файла?
И можно ли сделать маску по размеру файла? »
а это как? размер может быть либо больше определенного, либо меньше. а маска как будет работать?
AZJIO, а можно ли сделать маску исключения файлов по папкам? »
Можно, но не экономично получается, то есть заведомо тормозить выполнение сценария.
Например если добавить проверку в каждый запрос, то проверяется набор символов, при каждом запросе. Если сделать детект с помощью регулярного выражения, то скрипт будет обрабатывать этот каталог (холостой ход), потом вырезать ненужное. здесь специальную функцию лучше делать, дабы тем кому эта фича никогда не понадобилась не страдали.
Вообще такая UDF уже есть, смотри _RecFileListToArray в справке, по ссылке выше, но у неё недостаток в том, что она указывает папку, а не относительный путь к папке, то есть если указать в исключения 'папка1;папка2' то все эти папки будут игнорироваться, а обычно требуется исключить конкретную папку, а не одноимённые. И второй недостаток - используется с ключами $iReturn = 0 и $iRecur = 1, то есть возвращает папки и файлы.
Есть иной вариант _PathSearch (http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/page__view__findpost__p__956853), просто взять из неё регулярное выражение и с помощью него вырезать из результатов ненужные папки, примерно так
#include <Array.au3> ; для _ArrayDisplay
#include <FileOperations.au3>
$FileList=_FO_FileSearch(@WindowsDir, 'exe|dll', True, 125, 0, 0, 0)
$FileList = _ExcludePaths($FileList, 'system32\*|Microsoft.NET\*|assembly\*|WinSxS\*|RegisteredPackages\*')
MsgBox(0, 'Сообщение', $FileList)
$FileList = StringSplit($FileList, @CRLF, 1)
_ArrayDisplay($FileList, UBound($FileList) & ' - RegExp')
; Получение списка и обработка регулярным выражением
Func _ExcludePaths($FileList, $Mask)
$Mask = StringReplace(StringReplace(StringRegExpReplace($Mask, '[][$^.{}()+\\]', '\\$0'), '?', '.'), '*', '.*?')
$FileList = StringRegExpReplace($FileList & @CRLF, '(?mi)^(' & $Mask & ')\r\n', '')
$FileList = StringReplace(StringTrimRight($FileList, 2), '|', '')
Return $FileList
EndFunc
Если в _FO_FileSearch вывод относительных путей, то и в маске функции _ExcludePaths указывать относительные пути. Если в _FO_FileSearch указать возврат полных путей, то и в _ExcludePaths указывать лучше полные. В любом случае лучше элемент маски завершать символами "\*" что исключит детект файлов. Это не экономичный вариант, исключаемая папка будет сканироваться.
И можно ли сделать маску по размеру файла? »
Можно, есть даже функция от _FileFindEx (http://www.autoitscript.com/forum/topic/90545-filefindex-get-more-from-filefolder-searches/page__p__651141#entry651141) от Ascend4nt. Насколько я понял она возвращает расширенную информацию о файле при каждом шаге поиске. Это работает быстрее нативных функций AutoIt3, которые сначала получают имя, а потом другими функциями можно получить атрибуты, размер и прочее.
Но в текущем варианте либо ручная правка UDF под свои запросы, либо результаты прогнать повторно в цикле, сравнивая с указанным размером. Для этого в начале получить данные в массив, потом проверить размеры и соответственно исключить
; Проверяем равенство и исключаем данные
For $i = 1 To $aFileList[0]
If FileGetSize($aFileList[$i])=34579 Then $aFileList[$i]=''
Next
; Объединяем массив в список
$FileList=''
For $i = 1 To $aFileList[0]
If $aFileList[$i] Then $FileList &= $aFileList[$i] &@CRLF
Next
$FileList=StringTrimRight($FileList, 2) ; обрезаем последние 2 символа
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.