Что нового

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

AZJIO

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
AZJIO сказал(а):
А то DirCreate медленно работает...

Код:
$Timer = TimerInit()
DirCreate(@ScriptDir & '\~RGTAASD')
ConsoleWrite(FileExists(@ScriptDir & '\~RGTAASD') & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)


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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
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,757
Репутация
1,151
Yashied
madmasles
Я понимаю что дело не в скорости создания, а в скорости появления в проводнике, и потом нужно подгадать время появления с небольшим запасом, что послать F2 на выделение и переименование. На практике приходится ждать...

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
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,757
Репутация
1,151
Yashied
Чего я и боялся ))) автообновление не айс, привычка новьё или временные папки в конце списка создаются.
 

Yashied

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

AZJIO

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

Yashied

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Система использует 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,716
CreatoR, это я уже предлагал выше. Нужно эквивалент ALT-F-W-F. Хотел подобрать ID соответствующего меню и послать WM_COMMAND, но не нашел. Походу popup меню формируется в процессе вызова... В сети тоже ничего путного не нашел, есть конечно для этого какие-то утилиты, но без исходников.
 
Автор
A

AZJIO

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

Yashied

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

CreatoR

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

Yashied

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

Код:
#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,716
Автор
A

AZJIO

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

AZJIO

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