1 (изменено: qqlexa, 2018-05-25 21:39:34)

Тема: AHK: Список файлов и папок на диске или в папке

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


Папок внутри папки/диска : 1
Название папки - New
Файлов внутри папки/диска : 5
Названия файлов - New1.txt, New2.txt, New3.txt, New4.txt, New5.txt

2

Re: AHK: Список файлов и папок на диске или в папке

Используйте Loop для файлов и папок.

3 (изменено: svoboden, 2018-05-26 05:49:43)

Re: AHK: Список файлов и папок на диске или в папке

Можно еще через Api. Так, например, можно найти количество файлов в каталогах/подкаталогах нужной папки:


    Folder := "Путь к каталогу"

    CountFilesR(Folder) {
	static Counter := 0
	fso := ComObjCreate("Scripting.FileSystemObject")
	Folder := fso.GetFolder(Folder)
	Counter += Counter ? 0 : CountFiles(Folder)
	For Subfolder in Folder.SubFolders
	Counter += CountFiles(Subfolder),CountFilesR(Subfolder)
	return Counter
}

CountFiles(Folder) {
	fso := ComObjCreate("Scripting.FileSystemObject")
	Folder := fso.GetFolder(Folder)
	return fso.GetFolder(Folder).Files.Count
}

MsgBox % CountFilesR(Folder)
MsgBox % CountFiles(Folder)

Насчет имен и информации каталогов/файлов, то вот:
https://msdn.microsoft.com/ru-ru/librar … .110).aspx,
https://msdn.microsoft.com/en-us/library/9kcx47hd.aspx.
Записать полученную информацию можно командой FileAppend.

4 (изменено: teadrinker, 2018-05-26 17:02:32)

Re: AHK: Список файлов и папок на диске или в папке

svoboden, вы привели хороший пример того, как НЕ нужно писать код.
Запустите:

FileCreateDir, % A_ScriptDir . "\NewFolder\NewFolder"
FileAppend,, % A_ScriptDir . "\NewFolder\NewFolder\test.txt"

    Folder := A_ScriptDir . "\NewFolder"

    CountFilesR(Folder) {
   static Counter := 0
   fso := ComObjCreate("Scripting.FileSystemObject")
   Folder := fso.GetFolder(Folder)
   Counter += Counter ? 0 : CountFiles(Folder)
   For Subfolder in Folder.SubFolders
   Counter += CountFiles(Subfolder),CountFilesR(Subfolder)
   return Counter
}

CountFiles(Folder) {
   fso := ComObjCreate("Scripting.FileSystemObject")
   Folder := fso.GetFolder(Folder)
   return fso.GetFolder(Folder).Files.Count
}

MsgBox % CountFilesR(Folder)
MsgBox % CountFilesR(Folder)

Во втором сообщении результат другой, странно, правда?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5 (изменено: svoboden, 2018-05-26 17:51:40)

Re: AHK: Список файлов и папок на диске или в папке

Да, согласен, а если написать еще один msgbox внизу, то тоже результат другой. Это как-то прибавляет результат. Может, счетчик сбрасывать надо.

6

Re: AHK: Список файлов и папок на диске или в папке

У вас Counter — статическая переменная, при каждом вызове новые данные приплюсовываются к старому значению.

Кроме того, не нужно создавать fso := ComObjCreate("Scripting.FileSystemObject") каждый раз заново при рекурсивном вызове, достаточно создать один раз и передавать fso при вызове.

Также нет никакого смысла разбивать алгоритм на две функции, fso.GetFolder(Folder).Files.Count можно получать сразу.

Вообще не стоит для этой задачи использовать рекурсию, можно получить переполнение стека.

#NoEnv
SetBatchLines, -1

folder := A_ScriptDir

counter := 0
Loop, Files, %folder%\*, FR
   counter++

MsgBox, % counter
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7

Re: AHK: Список файлов и папок на диске или в папке

teadrinker, так это понятно, мне хотелось через com просто, т.к. больше информации можно получить о каталогах/файлах.

8

Re: AHK: Список файлов и папок на диске или в папке

В любом случае можно обойтись циклом вместо рекурсии.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: AHK: Список файлов и папок на диске или в папке

Хорошо, буду знать.

10

Re: AHK: Список файлов и папок на диске или в папке

KusochekDobra, Да, буду сидеть и разбираться.