Автор Тема: DirCreate() медленно работает  (Прочитано 6840 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
DirCreate() медленно работает
« Создано: Апрель 21, 2010, 16:37:43 »
На WinAPI есть создание новой папки? А то DirCreate медленно работает, а горячими клавишами мигают менюшки. На vbs где-то видел давно.
« Последнее редактирование: Апрель 21, 2010, 19:51:28 от Yashied »

Русское сообщество AutoIt

DirCreate() медленно работает
« Отправлен: Апрель 21, 2010, 16:37:43 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
DirCreate() медленно работает
« Ответ #1, Отправлен: Апрель 21, 2010, 17:35:05 »
А то DirCreate медленно работает...

Код: AutoIt [Выделить]
$Timer = TimerInit()
DirCreate(@ScriptDir & '\~RGTAASD')
ConsoleWrite(FileExists(@ScriptDir & '\~RGTAASD') & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)


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


Думай, прежде чем говорить.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
DirCreate() медленно работает
« Ответ #2, Отправлен: Апрель 21, 2010, 17:56:10 »
AZJIO
Вот так на моем стареньком ноутбуке отрабатывает за ~0,75 - 0,85 секунд. По-моему, приличная скорость:
Код: AutoIt [Выделить]
$Timer = TimerInit()
For $i = 1 To 1000
DirCreate('E:\Новая папка\Новая папка\Новая папка\Новая папка' & '\~' & $i)
ConsoleWrite(FileExists('E:\Новая папка\Новая папка\Новая папка\Новая папка' & '\~' & $i) & @CR)
Next
ConsoleWrite(TimerDiff($Timer) & @CR)


Русское сообщество AutoIt

DirCreate() медленно работает
« Ответ #2 Отправлен: Апрель 21, 2010, 17:56:10 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741

  • Автор темы
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
DirCreate() медленно работает
« Ответ #3, Отправлен: Апрель 21, 2010, 18:13:45 »
Yashied
madmasles
Я понимаю что дело не в скорости создания, а в скорости появления в проводнике, и потом нужно подгадать время появления с небольшим запасом, что послать F2 на выделение и переименование. На практике приходится ждать...

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

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
DirCreate() медленно работает
« Ответ #4, Отправлен: Апрель 21, 2010, 18:50:20 »
AZJIO

Код: AutoIt [Выделить]
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


Русское сообщество AutoIt

DirCreate() медленно работает
« Ответ #4 Отправлен: Апрель 21, 2010, 18:50:20 »

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741

  • Автор темы
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
DirCreate() медленно работает
« Ответ #5, Отправлен: Апрель 21, 2010, 19:21:23 »
Yashied
Чего я и боялся ))) автообновление не айс, привычка новьё или временные папки в конце списка создаются.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
DirCreate() медленно работает
« Ответ #6, Отправлен: Апрель 21, 2010, 19:48:46 »
А что нужно сделать в конце-концов? Сдается мне, что все намного проще должно быть.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741

  • Автор темы
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: DirCreate() медленно работает
« Ответ #7, Отправлен: Апрель 22, 2010, 14:03:27 »
Yashied
Эта тема уже существует, я лишь хотел чтоб это было красиво сделано. Эксплорер содержит команду на создание папки, а значит вызов из своих ресурсов определённой функции, вот я и хотел чтоб этот вызов был стандартный, без DirCreate() и без горячих клавиш вызова меню. Во многих программах есть кнопка создать новую папку.

Русское сообщество AutoIt

Re: DirCreate() медленно работает
« Ответ #7 Отправлен: Апрель 22, 2010, 14:03:27 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: DirCreate() медленно работает
« Ответ #8, Отправлен: Апрель 22, 2010, 14:19:45 »
Я покапался в системе и ничего не нашел. :( Но в Windows 7 вроде для этого сделали горячую клавишу.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: DirCreate() медленно работает
« Ответ #9, Отправлен: Апрель 22, 2010, 14:27:06 »
Система использует API для создания папки, и сразу же обновляет проводник:

Код: AutoIt [Выделить]
#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

« Последнее редактирование: Апрель 22, 2010, 14:37:11 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: DirCreate() медленно работает
« Ответ #10, Отправлен: Апрель 22, 2010, 14:38:02 »
CreatoR, это я уже предлагал выше. Нужно эквивалент ALT-F-W-F. Хотел подобрать ID соответствующего меню и послать WM_COMMAND, но не нашел. Походу popup меню формируется в процессе вызова... В сети тоже ничего путного не нашел, есть конечно для этого какие-то утилиты, но без исходников.

Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2741

  • Автор темы
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: DirCreate() медленно работает
« Ответ #11, Отправлен: Апрель 22, 2010, 15:30:50 »
Yashied
Используя команду
$tmp = FileSelectFolder ( "Открыть папку",'','3',@WorkingDir & '')
получаем диалог с кнопкой создания папки, так вот эта папка создаётся быстро и в проводнике и в диалоге.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: DirCreate() медленно работает
« Ответ #12, Отправлен: Апрель 22, 2010, 15:38:20 »
Это совсем другое.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8082
  • Репутация: 2314
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: DirCreate() медленно работает
« Ответ #13, Отправлен: Апрель 22, 2010, 20:27:33 »
Yashied  [?]
Цитировать
это я уже предлагал выше
Ну оно разве не подходит автору? кстати можно обновлять только то окно, где создаётся папка, чтобы весь экран не мелькал.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2700
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: DirCreate() медленно работает
« Ответ #14, Отправлен: Апрель 23, 2010, 03:05:26 »
Брутальный способ.

Код: AutoIt [Выделить]
#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

« Последнее редактирование: Апрель 23, 2010, 03:16:30 от Yashied »

Русское сообщество AutoIt

Re: DirCreate() медленно работает
« Ответ #14 Отправлен: Апрель 23, 2010, 03:05:26 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
3968 Просмотров
Последний ответ Июнь 10, 2012, 11:38:43
от asdf8
0 Ответов
2763 Просмотров
Последний ответ Октябрь 09, 2012, 20:33:54
от BJ78
0 Ответов
2515 Просмотров
Последний ответ Январь 22, 2013, 12:01:37
от minimen456
1 Ответов
2013 Просмотров
Последний ответ Февраль 28, 2013, 13:10:33
от madmasles
2 Ответов
1767 Просмотров
Последний ответ Апрель 12, 2013, 20:54:04
от Rivald
0 Ответов
1191 Просмотров
Последний ответ Февраль 25, 2014, 10:28:18
от StarWash
5 Ответов
1912 Просмотров
Последний ответ Март 24, 2014, 17:09:22
от Koto
2 Ответов
903 Просмотров
Последний ответ Сентябрь 30, 2016, 15:11:37
от astanid
3 Ответов
301 Просмотров
Последний ответ Ноябрь 07, 2018, 13:08:00
от hedji
4 Ответов
293 Просмотров
Последний ответ Март 04, 2019, 14:18:29
от sngr