Что нового

Дерево папок и файлов !

romashka

Новичок
Сообщения
11
Репутация
0
Нужен скрипт на автоит !
Который запишет мне все расположение папок и файлов на диске в файл а потом оттуда прочитает в GUI,но с подпапками и прочем.Тоесть он будет читать НЕ напрямую а то,что уже ЗАПИСАЛ в некий файл и потом ОТТУДА ПРОЧИТАЛ все расположение.ТОесть дал мне схему расположения файлов и папок на компьютере ! Еще не поняли? Ну вот например если ввести в cmd - tree c:\ ,то будет чтото подобное ! но там как видим все слитно и єто на километр такого листа а мне нужно чтбы было в меню там подменю список..ну как обычный файл менеджер почти !!!

Ну я незнаю как это обьяснить просто очень нужно это касается универа !!!!! помогите если не трудно !!!!!!!!!! Я с универа домой должна принести файл в котором записано ВСЕ что есть на компе все файлы и папки (но не содрежимое а тоесть расположение место) В ЧИТАЕМОМ ВИДЕ!!!!!!!! :IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1: :IL_AutoIt_1:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
romashka сказал(а):
Есть задача с которой я не могу справиться !
Нужно предоставить все файлы и все папки на компьютере но в необычном ввидео !
В оффлайне ! Тоесть както их записать все в файл и потом прочитать с помощью автоит !
Но так,чтобы было удобно по папочкам.Но ОФФ-записбю так бы сказать !

Что могу сделать я - так это с помощью консоли и команды tree но там немного не так как мне нужно а именно не могу сделать чтобы ы скею были папки там..в общем кто может помогите !!!! :whistle: :whistle: :whistle: :IL_AutoIt_1:

romashka, ты что сегодня курил(а)? Я вообще ничего не понял, т.е. совсем. Я советую тебе немного наморщить ум, сосредоточиться и написать еще раз, но только более земным языком, то, что собственно требуется. В противном случае, я закрою эту тему к :Censored: матери.

:smoking:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
romashka
Посмотри на скрипт Yashied
"Поиск файлов на диске" тут http://autoit-script.ru/index.php/topic,315.0.html
в строке _FindFiles('C:', '*.txt') вместо *.txt поставь маску *.*
Посмотри как он работает. Может тебе этого и достаточно будет.
Тогда просто вместо вывода в консоль выведешь в файл.
Но строк будет очень много.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Ну в Total Commander есть архиваторный плагин Catalog Maker, он как раз это делает.
Есть еще программа Beyond Compare, в ней тоже можно сделать образ диска без содержимого.
Это конечно не AutoIt, но тоже удобно.
 
Автор
R

romashka

Новичок
Сообщения
11
Репутация
0
нет делов том что нужно именно на автоит (((
но как незнаю..(((
от него скрипт вроде бы понятно но как сделать так чтобы он записывал все что нужно то ..((
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Так еще быстрее.
Код:
RunWait(@ComSpec & " /c " & "dir c:\ /s >list.txt", "", @SW_HIDE)
MsgBox(64, "Инфо", "Готово")

Все запишется в файл list.txt в директории откуда запущен скрипт.


Добавлено:
Сообщение автоматически объединено:

от него скрипт вроде бы понятно но как сделать так чтобы он записывал все что нужно то ..((
Если имеется в виду скрипт Yashied, то так попробуй.
Код:
#Include <File.au3>
$file = FileOpen("test.txt", 1)
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

_FindFiles('C:', '*.*')

Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ;ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
			FileWrite($file, $sRoot & '\' & $FileList[$i] & @CR)
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf
EndFunc   ;==>_FindFiles
FileClose($file)
MsgBox(64, "Инфо", "Готово")
 
Автор
R

romashka

Новичок
Сообщения
11
Репутация
0
проблему решила сама представаляете !!! с помощью скрипта от яшида !
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
romashka сказал(а):
Нужен скрипт на автоит!
Который запишет мне все расположение папок и файлов на диске в файл а потом оттуда прочитает в GUI, но с подпапками и прочем...

Ромашка, А вот мне интересно, с помощью какого такого "скрипта от яшида" ты решила этот вопрос? Я вроде не выкладывал скрипт, который отображает в GUI дерево папок, и тем более непосредственно из файла-образа. Получить список файлов на диске, это не проблема, но отображение потом этого хозяйства в GUI (TreeView) будет нетривиальной задачей, здесь по идее должна получиться жуткая рекурсия. Или может быть ты опять неверно сформулировала задачу?

:wall_brake:

В любом случае, вот, что у меня получилось.


TreeToDisk.au3 (этим скриптом создаешь файл-образ)

Код:
#Include <File.au3>

Opt('MustDeclareVars', 1)

Global Const $sRoot = RegRead('HKLM\SOFTWARE\AutoIt v3\AutoIt', 'InstallDir')
Global Const $sFile = @ScriptDir & '\tree.txt'

Global $hFile

$hFile = FileOpen($sFile, 2)
_EnumFiles($sRoot)
FileClose($hFile)

Func _EnumFiles($sRoot)

	Local $FileList

	FileWriteLine($hFile, $sRoot & '\')
	$FileList = _FileListToArray($sRoot, '*', 2)
	If Not @error Then
		For $i = 1 To $FileList[0]
			_EnumFiles($sRoot & '\' & $FileList[$i])
		Next
	EndIf
	$FileList = _FileListToArray($sRoot, '*', 1)
	If Not @error Then
		For $i = 1 To $FileList[0]
			FileWriteLine($hFile, $sRoot & '\' & $FileList[$i])
		Next
	EndIf
EndFunc   ;==>_EnumFiles



TreeFromDisk.au3 (этот скрипт отображает созданный ранее файл-образ в TreeView)

Код:
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUITreeView.au3>
#Include <TreeViewConstants.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global Const $sFile = @ScriptDir & '\tree.txt'

Global $hForm, $hTreeView, $hImageList, $hFile, $sRoot

SplashTextOn(':-)', 'Wait...', 300, 100, Default, Default, 32, 'Tahoma', 18)

$hForm = GUICreate('MyGUI', 600, 600)
GUICtrlCreateTreeView(20, 20, 560, 560, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$hTreeView = GUICtrlGetHandle(-1)

$hFile = FileOpen(@ScriptDir & '\tree.txt')
$sRoot = FileReadLine($hFile)
If $sRoot Then
	$hImageList = _GUIImageList_Create(16, 16, 5, 1)
    _GUIImageList_AddIcon($hImageList, @SystemDir & '\shell32.dll', 3)
    _GUIImageList_AddIcon($hImageList, @SystemDir & '\shell32.dll', 4)
    _GUIImageList_AddIcon($hImageList, @SystemDir & '\shell32.dll', 0)
    _GUICtrlTreeView_SetNormalImageList($hTreeView, $hImageList)
	_GUICtrlTreeView_BeginUpdate($hTreeView)
	_EnumPaths($sRoot)
	_GUICtrlTreeView_SetState($hTreeView, _GUICtrlTreeView_GetFirstItem($hTreeView), $TVIS_EXPANDED, 1)
	_GUICtrlTreeView_EndUpdate($hTreeView)
EndIf

FileClose($hFile)

GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

SplashOff()

GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _EnumPaths($sRoot, $hItem = 0)

	Local $hSubItem, $Data, $Dir, $Path

	While 1
		$Dir = StringSplit($sRoot, '\')
		If StringRight($Dir[$Dir[0] - 1], 1) = ':' Then
			$Dir[$Dir[0] - 1] &= '\'
		EndIf
		$hSubItem = _GUICtrlTreeView_AddChild($hTreeView, $hItem, $Dir[$Dir[0] - 1], 0, 1)
		While 1
			$Path = FileReadLine($hFile)
			Switch @error
				Case  0

				Case -1
					Return 0
				Case Else
					Return SetError(2, 0, 0)
			EndSwitch
			If Not $Path Then
				ContinueLoop
			EndIf
			$Dir = StringSplit($Path, '\')
			If $Dir[$Dir[0]] Then
				If StringRegExpReplace($Path, '\\.[^\\]*\Z', '\\') = $sRoot Then
					_GUICtrlTreeView_AddChild($hTreeView, $hSubItem, $Dir[$Dir[0]], 2, 2)
					ContinueLoop
				Else
					Return SetError(1, 0, $Path)
				EndIf
			EndIf
			If StringRegExpReplace($Path, '\\.[^\\]*\\\Z', '\\') <> $sRoot Then
				Return $Path
			EndIf
			While 1
				$Data = $Path
				$Path = _EnumPaths($Path, $hSubItem)
				Switch @error
					Case 1
						_GUICtrlTreeView_AddChild($hTreeView, $hSubItem, StringRegExpReplace($Path, '^.*\\', ''), 2, 2)
						ExitLoop
					Case 2
						Return SetError(2, 0, 0)
				EndSwitch
				If Not $Path Then
					Return 0
				EndIf
				If StringRegExpReplace($Path, '\\.[^\\]*\\\Z', '\\') = $sRoot Then
					ContinueLoop
				Else
					Return $Path
				EndIf
			WEnd
		WEnd
	WEnd
EndFunc   ;==>_EnumPaths

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW , $lParam)
    Local $hTV = DllStructGetData($tNMTREEVIEW, 'hWndFrom')
    Local $ID = DllStructGetData($tNMTREEVIEW, 'Code')

    Switch $hTV
        Case $hTreeView
            Switch $ID
				Case $TVN_ITEMEXPANDEDA, $TVN_ITEMEXPANDEDW
					_GUICtrlTreeView_SetImageIndex($hTreeView, DllStructGetData($tNMTREEVIEW, 'NewhItem'), BitAND(DllStructGetData($tNMTREEVIEW, 'NewState'), $TVIS_EXPANDED) = $TVIS_EXPANDED)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Так никто и не заценил второй пример (TreeFromDisk.au3) с чумавой рекурсией?

:whistle:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Yashied
Я попробовал.
Замечательно.
Взял себе, в коллекцию.
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Yashied сказал(а):
Так никто и не заценил второй пример (TreeFromDisk.au3) с чумавой рекурсией?

:whistle:
Отличная работа! Мне не меньше года усердного изучения АНГЛИЙСКОГО ( именно его, а не самого программирования ) надо что бы такое самостоятельно навоять :thumbs_up:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А это не сойдёт ? Через веб-браузер ;)

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 613, 423, 192, 124)
$Obj1 = ObjCreate("Shell.Explorer.2")
$Obj1_ctrl = GUICtrlCreateObj($Obj1, 0, 0, 610, 420)
GUISetState(@SW_SHOW)
$Obj1.Navigate("C:\")
Sleep(1000)
$Obj1.Navigate("C:\")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Примеры Yashied очень хорошо. Но как можно сделать вот так

или так

:(
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
armenxxx1
Попробуй открыть explorer.exe
Если используя AutoIt, то вот тема
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Спасибо, но я хочу сохранены в файл и прочитать его и визуализировать как пример Yashied.
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Код:
Dir(@HomeDrive & "\Windows")
Func Dir($aPath)
$file = FileOpen("test.txt", 2)

$hSearch = FileFindFirstFile($aPath & "\*.*")
If $hSearch <> -1 Then
	$nItem = -1
	While 1
		$aFile = FileFindNextFile($hSearch)
		If @error Then ExitLoop
		$SizeType = ""
		$yyyymd = ""
		If StringInStr(FileGetAttrib($aPath & "\" & $aFile), "D") Then
			$SizeType = "Dir"
		Else
			$SizeType = Round(FileGetSize($aPath & "\" & $aFile) / 1000) & " KB"
		EndIf
		$t =  FileGetTime($aPath & "\" & $aFile, 1)
		$yyyymd = $t[0] & "/" & $t[1] & "/" & $t[2]
		FileWriteLine($file, $aPath & "\" & $aFile & "|" & $SizeType & "|" & $yyyymd)
	WEnd
	FileClose($hSearch)
EndIf
FileClose($file)
EndFunc


Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <GUIListView.au3>
#Include <WinAPI.au3>

$hGui = GUICreate("AutoIt3-Explorer V1.1 ;-)", 762, 578, -1, -1, BitOr($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))

$nViewMenu = GUICtrlCreateMenu("&View")
$nViewItem1 = GUICtrlCreateMenuItem("Icons", $nViewMenu, -1, 1)
$nViewItem2 = GUICtrlCreateMenuItem("Report", $nViewMenu, -1, 1)
GUICtrlSetState(-1, $GUI_CHECKED)
$nViewItem3 = GUICtrlCreateMenuItem("Small Icons", $nViewMenu, -1, 1)
$nViewItem4 = GUICtrlCreateMenuItem("List", $nViewMenu, -1, 1)

$Input1 = GUICtrlCreateInput("", 160, 24, 449, 21)

$nListView = GUICtrlCreateListView("Name|Size/Type|Changed",162, 49, 447, 489)
GUICtrlSendMsg(-1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

$file = FileOpen("test.txt", 0)
DirToList($file)
GUICtrlSendMsg($nListView, $LVM_SETCOLUMNWIDTH, 0, 180)
GUISetState()

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
            
        Case $nViewItem1 To $nViewItem4
            GUICtrlSetStyle($nListView, BitOr($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $nMsg - $nViewItem1))
    EndSwitch
WEnd

Func DirToList($szPath)
    Dim $hSearch, $szFile, $szDate, $szType, $nItem

	While 1
		$line = FileReadLine($szPath)
		If @error = -1 Then ExitLoop
		$days = StringSplit($line, "|")
		$xline = StringRegExpReplace($days[1], '^.*\\', '')
		If $xline = "" Then
		Else
			$nItem = GUICtrlCreateListViewItem($xline & "|", $nListView)
			local $Icon = _GetRegDefIcon($days[1])
			GUICtrlSetImage($nItem, $Icon[0], $Icon[1])
			If $days[2] = "Dir" Then
				GUICtrlSetData($nItem,"|DIR|" & $days[3])
				GUICtrlSetImage($nItem, "shell32.dll", 4)
			Else
				GUICtrlSetData($nItem,"|" & $days[2] & "|" & $days[3])
			EndIf
		EndIf
	Wend
	GUICtrlSetData($Input1, StringRegExpReplace($days[1], '\\.[^\\]*\Z', '\\'))
	FileClose($file)
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView = $nListView
    If Not IsHWnd($nListView) Then $hWndListView = GUICtrlGetHandle($nListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
   
    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_DBLCLK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
					$iItem = DllStructGetData($tInfo, 'Index')
					$xName = _GUICtrlListView_GetItemText($hWndListView, $iItem)
					If $xName = "" Then
					Else

						$days = StringSplit(GUICtrlRead(GUICtrlRead($nListView)), "||")
						If $days[2] = "DIR" Then
							MsgBox(4096,"", GUICtrlRead($Input1) & $xName)
							MsgBox(4096,"", "DIRRRR")
						Else
							MsgBox(4096,"", GUICtrlRead($Input1) & $xName)
							MsgBox(4096,"", "FILEEE")						
						EndIf	
					EndIf	
            EndSwitch
    EndSwitch
   
    Return $GUI_RUNDEFMSG
EndFunc

func _GetRegDefIcon($Path)
    
    const $DF_NAME  = @SystemDir & '\shell32.dll'
    const $DF_INDEX = 0
    
    local $filename, $name, $ext, $count, $curver, $defaulticon, $ret[2] = [$DF_NAME, $DF_INDEX]
    
    $filename = StringTrimLeft($Path, StringInStr($Path, '\', 0, -1))
    $count = StringInStr($filename, '.', 0, -1)
    if $count > 0 then
        $count = StringLen($filename) - $count + 1
    endif
    $name = StringStripWS(StringTrimRight($filename, $count), 3)
    $ext = StringStripWS(StringRight($filename, $count - 1), 8)
    if (StringLen($name) = 0) or (StringLen($ext) = 0) then
        return $ret
    endif
    $curver = StringStripWS(RegRead('HKCR\' & RegRead('HKCR\' & '.' & $ext, '') & '\CurVer', ''), 3)
    if (@error) or (StringLen($curver) = 0) then
        $defaulticon =  _WinAPI_ExpandEnvironmentStrings(StringReplace(RegRead('HKCR\' & RegRead('HKCR\' & '.' & $ext, '') & '\DefaultIcon', ''), '''', ''))
    else
        $defaulticon =  _WinAPI_ExpandEnvironmentStrings(StringReplace(RegRead('HKCR\' & $curver & '\DefaultIcon', ''), '''', ''))
    endif
    $count = StringInStr($defaulticon, ',', 0, -1)
    if $count > 0 then
        $count = StringLen($defaulticon) - $count
        $ret[0] = StringStripWS(StringTrimRight($defaulticon, $count + 1), 3)
        if $count > 0 then
            $ret[1] = StringStripWS(StringRight($defaulticon, $count), 8)
        endif
    else
        $ret[0] = StringStripWS(StringTrimRight($defaulticon, $count), 3)
    endif
    if StringLeft($ret[0], 1) = '%' then
        $count = DllCall('shell32.dll', 'int', 'ExtractIcon', 'int', 0, 'str', $Path, 'int', -1)
        if $count[0] = 0 then
            $ret[0] = $DF_NAME
            if StringLower($ext) = 'exe' then
                $ret[1] = 2
            else
                $ret[1] = 0
            endif
        else
            $ret[0] = StringStripWS($Path, 3)
            $ret[1] = 0
        endif
    else
        if (StringLen($ret[0]) > 0) and (StringInStr($ret[0], '\', 0) = 0) then
            $ret[0] = @SystemDir & '\' & $ret[0]
        endif
    endif
    if not FileExists($ret[0]) then
        $ret[0] = $DF_NAME
        $ret[1] = $DF_INDEX
    endif
    if $ret[1] < 0 then
        $ret[1] = - $ret[1]
    else
        $ret[1] = - $ret[1] - 1
    endif
    return $ret
endfunc; _GetRegDefIcon


Написал :smile:
 

labudator

Новичок
Сообщения
25
Репутация
0
Попробую развить эту старую тему. ..

А что если "файл-образ" делать не текстовым, а в базе данных, например SQLite и хранить не в виде списка а в виде дерева? это как нибудь позволит ускорить быстродействие? в частности я хочу чтобы TreeView не грузило сразу весь большущий список файлов, а только ту его часть которая находится в одной из веток. В той, которую в данный момент пожелал увидеть пользователь, нажав на "плюсик" в TreeView.. Так будет быстрее? Есть ли смысл заморачиваться? может где то уже есть подобное решение??

у меня таком в дереве будет около 200 тыс. элементов. и такой скрипт как в был тут выше работает меееееедленнооо
 
Верх