Что нового

DirCreate() медленно работает

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
На WinAPI есть создание новой папки? А то DirCreate медленно работает, а горячими клавишами мигают менюшки. На vbs где-то видел давно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
AZJIO сказал(а):
А то DirCreate медленно работает...
Код:
$Timer = TimerInit()
DirCreate(@ScriptDir & '\~RGTAASD')
ConsoleWrite(FileExists(@ScriptDir & '\~RGTAASD') & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)


~ 1 мс это по твоему медленно? DirCreate() создает папку очень быстро, просто в проводнике она появляется не сразу.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
AZJIO
Вот так на моем стареньком ноутбуке отрабатывает за ~0,75 - 0,85 секунд. По-моему, приличная скорость:
Код:
$Timer = TimerInit()
For $i = 1 To 1000
DirCreate('E:\Новая папка\Новая папка\Новая папка\Новая папка' & '\~' & $i)
ConsoleWrite(FileExists('E:\Новая папка\Новая папка\Новая папка\Новая папка' & '\~' & $i) & @CR)
Next
ConsoleWrite(TimerDiff($Timer) & @CR)
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Yashied
madmasles
Я понимаю что дело не в скорости создания, а в скорости появления в проводнике, и потом нужно подгадать время появления с небольшим запасом, что послать F2 на выделение и переименование. На практике приходится ждать...

а если две команды подряд, новая папка и файл описания "Текстовый документ", то команды глючат слегка. Если на горячих клавиша, когда мигает менюшка, то получается действительно 0,01 сек, и команды не глючат меж собой, у меня сейчас F9 и F10 - создание папки и текстового документа. Вот скрипт с добавкой F9 и F10
 

Yashied

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

Код:
DirCreate(@DesktopDir & '\~RGTAASD')
_UpdateExplorer(WinGetHandle('Progman Manager'))

Func _UpdateExplorer($hWnd = 0)
	If $hWnd Then
		DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0111, 'int', 0x7103, 'int', 0)
		Return
	EndIf
	Local $Opt = Opt('WinSearchChildren', 1)
	Local $List = WinList('[CLASS:SHELLDLL_DefView]')
	For $i = 1 To UBound($List) - 1
		DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $List[$i][1], 'int', 0x0111, 'int', 0x7103, 'int', 0)
	Next
	Opt('WinSearchChildren', $Opt)
EndFunc   ;==>_UpdateExplorer
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Yashied
Чего я и боялся ))) автообновление не айс, привычка новьё или временные папки в конце списка создаются.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
А что нужно сделать в конце-концов? Сдается мне, что все намного проще должно быть.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Yashied
Эта тема уже существует, я лишь хотел чтоб это было красиво сделано. Эксплорер содержит команду на создание папки, а значит вызов из своих ресурсов определённой функции, вот я и хотел чтоб этот вызов был стандартный, без DirCreate() и без горячих клавиш вызова меню. Во многих программах есть кнопка создать новую папку.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Я покапался в системе и ничего не нашел. :( Но в Windows 7 вроде для этого сделали горячую клавишу.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Система использует API для создания папки, и сразу же обновляет проводник:

Код:
#include <WinAPI.au3>

$iRet = _WinAPI_CreateDirectory(@DesktopDir & "\Новая папка")

ConsoleWrite(@error & ":" & $iRet & @LF)

Func _WinAPI_CreateDirectory($sPath, $hWnd = 0)
	Local $aRet = DllCall("Kernel32.dll", "int", "CreateDirectory", "str", $sPath, "int", 0)
	
	If Not $aRet[0] Then
		Return SetError(_WinAPI_GetLastError() > 0, 0, $aRet[0])
	EndIf
	
	If Not IsHWnd($hWnd) Then
		$hWnd = WinGetHandle('Progman Manager')
	EndIf
	
	Local $Opt = Opt('WinSearchChildren', 1)
	Local $List = WinList('[CLASS:SHELLDLL_DefView]')
	
	For $i = 1 To UBound($List) - 1
        DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $List[$i][1], 'int', 0x0111, 'int', 0x7103, 'int', 0)
	Next
	
	Opt('WinSearchChildren', $Opt)
	
	Return 1
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
CreatoR, это я уже предлагал выше. Нужно эквивалент ALT-F-W-F. Хотел подобрать ID соответствующего меню и послать WM_COMMAND, но не нашел. Походу popup меню формируется в процессе вызова... В сети тоже ничего путного не нашел, есть конечно для этого какие-то утилиты, но без исходников.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Yashied
Используя команду
$tmp = FileSelectFolder ( "Открыть папку",'','3',@WorkingDir & '')
получаем диалог с кнопкой создания папки, так вот эта папка создаётся быстро и в проводнике и в диалоге.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Это совсем другое.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Yashied [?]
это я уже предлагал выше
Ну оно разве не подходит автору? кстати можно обновлять только то окно, где создаётся папка, чтобы весь экран не мелькал.
 

Yashied

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

Код:
#Include <File.au3>
#Include <GUIListView.au3>
#Include <Misc.au3>

ConsoleWrite(_MakeDir('Program Manager') & @CR)

Func _MakeDir($hWnd, $sText = '', $sDir = 'New Folder')

	Local $hListView, $Opt, $Temp, $Index, $Timer

	$Opt = Opt('WinTitleMatchMode', 1)
	$hListView = ControlGetHandle(WinGetHandle($hWnd, $sText), '', '[CLASS:SysListView32; INSTANCE:1]')
	Opt('WinTitleMatchMode', $Opt)
	If Not $hListView Then
		Return SetError(1, 0, '')
	EndIf
	If _GUICtrlListView_FindText($hListView, $sDir) > -1 Then
		$Index = 2
		While _GUICtrlListView_FindText($hListView, $sDir & ' (' & $Index & ')') > -1
			$Index += 1
		WEnd
		$sDir &= ' (' & $Index & ')'
	EndIf
	$Temp = _TempFile()
	DirCreate($Temp & '\' & $sDir)
	_ClipPutFile($Temp & '\' & $sDir)
	ControlSend($hListView, '', '', '^v')
	$Index = -1
	$Timer = TimerInit()
	While $Index < 0
		If TimerDiff($Timer) > 3000 Then
			ExitLoop
		EndIf
		$Index = _GUICtrlListView_FindText($hListView, $sDir)
		Sleep(10)
	WEnd
	DirRemove($Temp, 1)
	If $Index < 0 Then
		Return SetError(2, 0, '')
	EndIf
	_GUICtrlListView_EditLabel($hListView, $Index)
	Return SetError(2, 0, $sDir)
EndFunc   ;==>_MakeDir
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Ну и...
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
У меня скрипт не работает и я не могу разгадать, что добавить в параметры _MakeDir чтоб создалась папка. В %Temp% создаётся, и как я понял должна переместится в каталог активной папки...
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Да и про ^v я тоже заметил, но решил что если оттестировано, значит дело в другом. Эта ошибка наверно возникает у тех, у кого русский яз. по умолчанию, как у меня.
В скрипте Monamo аналогично приходилось менять ^с на ^{insert}
 
Верх