Удобная навигация в Windows Explorer и Total Commander

    Вы никогда не задумывались над тем, что навигация в Windows могла бы быть намного удобней? Почему бы не добавить возможность, аналогичную навигации по классам во многих современных IDE, когда в выпадающем списке, вызываемом сочетанием клавиш, отображаются папки с нужным именем, вот так:

    image

    Однажды задумавшись, я написал небольшое приложение под названием «Navigation Assistant», изображенное выше. Оно доступно здесь, исходный код открыт, само оно бесплатное, распространяется по лицензии MIT. Надеюсь, оно окажется кому-либо полезным.

    Зачем это нужно?


    Вот недостатки навигации в Windows Explorer и Total Commander, которые, уверен, у многих вызывают фрустрацию:
    1. при большой глубине вложенности искомой папки необходимо совершить множество кликов мышью
    2. поиск по умолчанию в Windows Explorer невероятно медленный. Кроме того, чтоб воспользоваться им, надо запустить сам explorer, кликнуть по полю поиска, набрать имя папки или файла целиком, и долго ждать
    3. В Total Commander имеются подсказки при наборе пути в адресной строке, однако набирать необходимо либо полный путь, либо относительный путь (по отношению к текущей папке), что неудобно

    Поэтому я и написал «Navigation Assistant», работа которого аналогична навигации по классам или файлам многих современных IDE: сочетания Ctrl-N и Ctrl-Shift-N в продуктах JetBrains (ReSharper, IDEA, PhpStorm, WebStorm), Ctrl-Shift-T в Eclipse.

    Бонусом, получаемым при использовании этой программы, является лучшая структура каталогов. Многие разработчики, особенно прочитавшие Code Complete, в курсе того, что мозг хорошо справляется с 7 ± 2 объектами в рабочей памяти; поэтому так же, как полезно ограничивать число полей и методов в классе, полезно ограничивать число подкаталогов в данном каталоге.

    При текущем положении вещей этого можно достигнуть лишь ценой неудобной навигации. При использовании Navigation Assistant более не придется опасаться большой вложенности каталогов.

    Как этим пользоваться?


    Пока поддерживается лишь быстрая навигация по папкам, но не по файлам.

    Чтобы быстро попасть в нужную вам папку, в окне Windows Explorer или Total Commander (либо в любом другом, но тогда для навигации будет инстанциирован новый Windows Explorer) нажмите специальное сочетание клавиш (по умолчанию Ctrl-Shift-M, но его можно изменить в настройках). Появится основное окошко приложения:



    Начните набирать имя папки, до которой вы хотели бы добраться.

    Killer feature: необязательно набирать имя папки целиком; например, чтоб попасть в Documents and Settings, можно набрать лишь «documents and». Более того, необязательно набирать слово «documents» целиком, хватит и «doc and» (привет, JetBrains!); также необязательно набирать имя папки с первого слова: подойдет и «and settings». Специально для разработчиков поддерживается pascal/camel case: к строке поиска «nav assist» будет отнесена и папка «NavigationAssistant».

    В результате этих манипуляций на экране появится список подходящих каталогов:



    Вам остается либо выбрать нужный элемент мышкой, либо воспользоваться клавишами вверх/вниз и кликнуть Enter (фокус ввода может оставаться в текстовом поле в это время).

    Если окошко чем-либо не угодило, его можно быстро свернуть в трей клавишей Escape.

    Если же вызвать программу не в Windows Explorer и не в Total Commander, то откроется новое окно Windows Explorer (с необходимой папкой); в настройках же можно изменить навигатор по умолчанию на Total Commander.

    Что в нем есть еще?


    Еще имеется окно настроек, в котором можно изменить
    1. список программ для поддержки улучшенной навигации (например, отключить Total Commander)
    2. программу для навигации по умолчанию
    3. сочетание клавиш для вызова окошка Navigation Assistant
    4. указать, в каких каталогах производить поиск (например, только в C:\Users\ или только в D:\)
    5. кроме того, можно исключить некоторые имена каталогов из результатов (например, bin, obj, .svn)
      (точнее, будет исключен любой путь, содержащий папку bin; замечу, что на самом деле это регулярные выражения, так что можно указать что-то типа bin\S*)
    6. настроить загрузку по умолчанию (рекомендуется, потому что это позволит не обновлять внутренний кэш каталогов при каждом запуске)

    Для всех опций есть в наличии всплывающие подсказки. Чтоб добраться до настроек, просто кликните правой кнопкой по иконке в трее.

    Как это сделано


    Утилита написана на Microsoft .Net 3.5 с помощью технологии WPF, поэтому должна работать везде, где присутствует .Net 3.5.

    Инсталлер написан с помощью Inno Setup, который я дико рекомендую всем, кто пишет инсталлеры: он намного лучше WiX, Install Shield, Visual Studio Installer, потому что он
    1. свободный и бесплатный
    2. модульный (не привязан к технологиям Microsoft)
    3. прозрачный (редактируется только текстовый скрипт, никакого визуального программирования, как, например, в Visual Studio Installer)
    4. как следствие, файлы инсталлера не пересоздаются при каждом изменении—нет проблем с системой контроля версий
    5. гибкий (поддерживает скриптование с помощью Pascal/Delphi). До этого Delphi я видел последний раз лет 7 назад, на первом курсе института, но преимущества InnoSetup этот недостаток с лихвой компенсируют
    6. ах да, он волшебным образом создает один файл установки для x32 и x64 версий

    Сравнение инсталлеров можно найти, например, здесь.

    В коде присутствует несколько нетривиальных моментов:

    Реакция на глобальные нажатие клавиш

    Чтоб вовремя показать окно Navigation Assistant, необходимо слушать нажатие комбинации клавиш глобально (то есть во всех приложениях). .Net не позволяет этого «из коробки». Посему я воспользовался кодом отсюда (хотя есть несколько других решений, стоит лишь погуглить фразы global hooks/ global hotkeys).

    Установка фокуса на неактивное приложение

    После того, как мы обнаружили, что в каком-то окне была нажата заветная комбинация клавиш, необходимо показать Navigation Assistant, а также установить в него фокус (сделать активным, то бишь).

    Да, в WPF имеется метод Window.Activate, который вызывает WinApi функцию SetForegroundWindow, и, следовательно, обладает всеми ее ограничениями. А именно, если ваше приложение неактивно при вызове метода, окно не будет сделано рабочим, то есть фокус останется в старом окне. Вообще-то, это правильно, чтоб не давать злонамеренным программам внезапно изменять текущий фокус и всячески препятствовать работе юзера. Но в нашем случае хочется обойти это ограничение.

    Помогло решение вот отсюда, хотя есть несколько других (раз, два), но они работали не так хорошо.

    Интеграция с Windows Explorer

    Для того, чтоб получать список открытых окон Windows Explorer, был позаимствован вот этот код. Имея обертку над COM-объектом, можно легко менять текущий путь в данном окне explorera.

    Интеграция с Total Commander

    Интеграция с Total Commander осуществляется с помощью опций командной строки, в первую очередь /O, которая устанавливает передаваемый вместе с ней путь не в новом экземпляре Total Commander, а в уже открытом (если таковой имеется).

    Архитектура


    Используется стандартная многоуровневая архитектура (отличный обзор есть в "Domain Driven Design Quickly Online" за авторством Avram и Marinescu)
    1. UI Layer
      1. Views
    2. Presenters Layer
      1. Presenters
      2. Presentation Services
      3. View Models
      4. View Model Mappers
    3. Domain Model aka Business Layer
      1. Domain Services
      2. Domain Data Objects (plain Data Transfer Objects)
    4. Никакого Data Access Layer :-)

    Вначале я пытался использовать шаблон Model-View-View Model, но потом перешел к
    Model-View-Presenter по следующим причинам:
    1. MVP добавляет дополнительный уровень абстракции Presenters, а без него вся логика оказывается во View Models, и последние неоправданно разрастаются
    2. Эта логика семантически не должна принадлежать View Models (single responsibility, то-се)
    3. Невозможно использовать interface-driven development (для Views)
    4. Как следствие, UI layer превращается в кашу (в смысле, отсутствует разделение обязанностей, модульность, ясные интерфейсы)

    Таким образом, сейчас используется Model-View-Presenter, а UI и данные связываются через View Models (WPF Binding), притом View Models
    1. либо передаются в методы интерфейсов представлений из презентеров
    2. либо инстанциируются самими представлениями

    Основная функциональность покрыта тестами (используются nUnit и Moq).

    Проблемы


    Наверняка в приложении есть еще ненайденные баги.

    Кроме того, я не большой специалист по рисованию иконок, поэтому иконка в системном трее на белом фоне выглядит угловатой, как будто без антиалиасинга; во всех остальных случаях иконки выглядят, для меня, по крайней мере, приемлемо (но я не откажусь от любой помощи или советов).

    При первом запуске какое-то время будет происходить поиск всех папок на пользовательском компьютере, поэтому придется подождать несколько минут.

    Если Navigation Assistant был закрыт не при последнем выключении компьютера, или не был запущен автоматически при запуске системы, то невозможно сказать, актуален ли текущий кэш каталогов; поэтому этот кэш будет обновляться в дополнительном потоке, а до завершения этого процесса будет использоваться последний сохраненный кэш каталогов (который может не полностью соответствовать настоящей файловой системе).

    Да, .Net вообще и WPF медленные и ресурсоемкие, но с этим приходится мириться.

    Заключение


    Итак, я поспешил поделиться с хабрасообществом небольшой утилитой для удобной навигации в Windows Explorer и Total Commander. Надеюсь, она окажется полезной кому-либо. Кроме того, возможно, окажется полезным краткий обзор технических решений.

    Еще раз ссылки: на инсталлятор, на проект на google code (используется svn, как с высокой вероятностью известный большинству).

    Исходный код открыт, приложение бесплатное, распространяется по лицензии MIT.

    Всем спасибо!
    Поделиться публикацией

    Комментарии 78

      +2
      В проводнике Windows7 если не ошибаюсь такое есть
      • НЛО прилетело и опубликовало эту надпись здесь
          +3
          В Total Commander это тоже уже реализовано)
            0
            Где такое в Total-е?
              0
              В адресной строке внизу
            +2
            Да, я в курсе, но вот от необходимости совершать все эти действия я и хотел бы избавиться (открыть explorer, перевести взгляд на адресную строку, щелкнуть на ней, печатать полный путь, нажимая tab и тп) (собственно, и постарался объяснить в статье).

            И заодно добавить поиск по неполному имени (prog fil вместо downloaded program files) (это быстро и вы даже можете не знать точное имя).

            И, кроме того, удобно искать папку только по имени, не будучи уверенным, где она находится (например, вы подзабыли, находится ли каталог Blah-Blah в папке Program Files или Program Files (x32))--вам придется два раза набирать путь, если сразу не угадаете.

            И мне нравится возможность просматривать список соответствий сразу же при нажатии клавиш (чтоб иметь возможность изменить запрос, если я ошибся в имени папки).
          +1
          Поиск-то в Вин 7 вовсе не медленный, особенно если в индексе, и вызывать его можно быстрее — из меню Пуск. Я бы скорее добавил в левую панель проводника нужные мне папки или закрепил бы их на иконке проводника в панели задач. Киллер фича ок.
            0
            Только не всегда охото индексировать террабайты информации…
              +4
              Не преувеличивайте, порнофайлов на Вашем компьютере меньше терабайта.
              Ну и к слову, индексировать нужно ведь не террабайты информации, а максимум — несколько мегабайт имен файлов для подсказок.
                0
                Музыка во флаке довольно таки много занимает, не скажу что я что-то часто там ищу (как правило в музыке все разложено по Исполнитель\Альбом\Трек и плюс медиа библиотека делает свое дело). Однако когда всетаки требуется там найти «пропавший» файл как правило использую сторонние программы, но никак не виндовый поисковик.
                  0
                  А можно поинтересоваться, какая разница для индексации — во флаке музыка, или в 64Кб/с mp3?
                    –9
                    Я про общие размеры. Все же 1Тб во флаке будет дольше индексироваться чем тоже самое в 320 или V0, и тем более 64.
                      +15
                      o_O Он не IT-шник, бейте его!

                      Размер тегов, длина имени файлов и скорость индексации от размера файла не зависит )
                        0
                        В одном кошельке было пусто. В другой — миллиард долларов по 1 центу.
                        Кошелек потерялся. Добрый человек его нашел и решил вернуть владельцу, благо внутри были координаты.
                        Вопрос: сколько нужно времени, чтобы прочитать бумажку с телефоном владельца первого и второго кошельков и зависит ли это от их содержимого (корыстные цели не учитывать)?
                          +6
                          Пример крут, но очевидно, что тому, кто с кошельком и миллиардом — больше. Ведь перед этим крайне необходимо запостить пару фоток этого детища вконтакт, написать статью на хабр о том, как мало сервисов, которые бы позволили быстро находиться потерявших и нашедших, взвесить ради интереса эту мелочь, написать второй пост на хабр о том, как ты собираешься отправить это все владельцу, чтобы народ плюсовал и ждал апдейтов… это Вам не индексаааация )))
                          –3
                          Одинакого будет индексироваться, я уверяю.
                            0
                            А если во всех форматах 1Тб, то flac еще и быстрее на порядок будет.
                  0
                  >>или закрепил бы их на иконке проводника в панели задач

                  а что мешает вам это сделать?
                  +1
                  Спасибо вам огромное!
                  Мне, программисту, этого функционала сильно не хватало.

                  Единственное, как можно было добиться чего-то подобного, это в папке набирать первые буквы нужного файла (не одну, а несколько, только быстро) — тогда выделялся нужный файл.
                    0
                    Очень удобно, взял на службу. Жду новых версий =)
                      0
                      Danke schoen!
                      +8
                      Года так 3 использую Everything — voidtools.com/
                      На форуме последние версии — forum.voidtools.com/viewforum.php?f=9

                      Создает кэш всех(!) имен файлов и папок. Моментальный поиск. Куча горячих клавиш, в том числе и вызов. Висит в трее и постоянно держит кэш в актуальном состоянии. Сканирование сетевых папок и т.д.

                      На сколько я понимаю, код открыт и есть консольный поисковик. Последняя тестовая версия была уже давно, но автор появляется на форуме и уверяет, что проект не мертв. Хотя и уже имеющаяся утилитка работает на 200%.

                      Поддерживает собственные фильтры. Я уже написал себе фильтр на удаление мусора (вместо сотни разных мусорочисток).
                        +4
                        P.S. База на суммарных 3Тб на 3х дисках и 155 тыс файлов создается в течении 30 секунд. База занимает 1,2 Мб.
                          0
                          Мне кажется, или такое физически невозможно?
                            +2
                            Емнип, она берет данные уже готовыми из каталога NTFS, потому все так быстро.
                              0
                              Если не индексировать всякие мета-теги, и содержимое файлов, а только пути, то вполне возможно.
                                0
                                Matolch прав. А что еще нужно для быстрого поиска файлов? Пробовал кучи утилит, сканирующих содержимое — база получалась по 3-5Гб и поиск по ней был не такой уж и быстрый. Лучше грамотно называть документы хотя бы парой точных слов, тогда и мароки меньше.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                а что значит «виндовый поиск из семерки был удален»? как удаляли?
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  +1
                                  А как интегрировали Everyhing с Total Commander-ом?
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Согласен на 100%, безумно рад, что услышал про неё как-то около года назад, великолепная программа, если кто не видел — рекомендую.
                                  +2
                                  1. А для диалогового окна «Сохранить как» утилита работает? Просто очень часто бывает ситуация, когда из браузера (или еще откуда-нибудь) хочешь сохранить какой-то файл, а он в качестве дефолтной папки показывает совсем-совсем не то место, которое нужно. И приходится долго и упорно выбирать место сохранения. Если бы тут нажать горячую клавишу и выбрать каталог, потом щелк! — и в этот каталог переходит также диалог «Сохранить как»…

                                  2. И второе пожелание: для Far Manager поддержка. Можно, например, так сделать: после выбора папки утилита может «печатать» в последнее активное окно Far-а (если это оно) последовательность: «cd <директория>», он тогда перейдет в эту директорию активной панелью.
                                    0
                                    1. Нет, к сожалению, не работает. Но идея отличная--как будет время, постараюсь сделать. Мне этого тоже не хватает)
                                    2. Тоже классная идея, спасибо, и тоже, надеюсь, через какое-то время добавлю
                                      0
                                      Солидарен c DmitryKoterov, но с некоторыми дополнениями:
                                      1. Не только для Сохранить, но и для Открыть пригодилось бы. Раньше использовал FileBoxExtender, он сохранял историю посещений в подобных диалогах + «избранное», но в 7-ке оно уже не работает так как хотелось бы.
                                      2. тоже хотелось бы видеть поддержку FAR'а, но с учетом возможности запуска оного через ConEmu.
                                      3. Возможность хоткей повесить не только на ctrl+alt+shift+[A-Z], но и на F1-F12 + другие кноповки(ScLok, PrtSc, Break, etc)!!!
                                        0
                                        Спасибо за пожелания--очень дельные. Займусь этим в первую очередь.
                                      0
                                      2. Есть отличный плагин: AltHistory, которого так не хватает в TotalCmd (хотя может что-то уже поменялось). Не совсем, чтобы аналог сабжу, но история на 10000 элементов (отдельно папок, команд и просмотров/редактирований) вполне себе позволяет находить даже весьма старые свои похождения по дискам. Поддерживает поиск по части слова: например «ws*32» найдет «c:\windows\system32».

                                      И еще не могу упомянуть замечательнейший плагин NamedFolders: позволяет переходить в папки по легко запоминающемуся, краткому, но соответствующему логике пользователя, символьному имени. Переходы выполняются вводом команды «cd:name». Префикс «cd:» вводится нажатием шортката Shift+Двоеточие. Мои примеры: «cd:sys32» — windows\system32, «cd:pf» — program files, «cd:md» — «My Documents». Преимущества над шорткатами типа Ctrl-1, Ctrl-2 два: ссылок может быть больше десяти; имя — краткое, но в то же время достаточно осмысленное, а не абстрактная цифра или буква.
                                      0
                                      Вам нужно добавить в выпадающий список номера, или что-то подобное, чтобы можно было выбрать каталог не используя мышки. Возможно, нужно сделать сочетание Ctrl+номер/буква, чтобы ввод чисел тоже был возможен.
                                        0
                                        Без мыши и сейчас возможно (в описании присутствует)--клавишами вверх-низ и энтер. Хотя ваша идея интересная--но цифры могут загромождать интерфейс.
                                        +1
                                        А чем InnoSetup так уж лучше Wix? Вроде почти по всем пунктам они похожи.

                                        1. свободный и бесплатный

                                        Прямо как Wix.

                                        2. модульный (не привязан к технологиям Microsoft)

                                        Разве он с windows installer никак не связан?

                                        3. прозрачный (редактируется только текстовый скрипт, никакого визуального программирования, как, например, в Visual Studio Installer)

                                        Wix то же самое.

                                        4. как следствие, файлы инсталлера не пересоздаются при каждом изменении—нет проблем с системой контроля версий

                                        Если я правильно понял, файлы инсталлера это вы скрипт имеете ввиду. Тогда тоже как в Wix.

                                        гибкий (поддерживает скриптование с помощью Pascal/Delphi). До этого Delphi я видел последний раз лет 7 назад, на первом курсе института, но преимущества InnoSetup этот недостаток с лихвой компенсируют

                                        Для Wix custom actions можно писать на c#, так что тут он даже лучше.

                                        ах да, он волшебным образом создает один файл установки для x32 и x64 версий

                                        Вот это, конечно, круто. Но с другой стороны если мы говорим о .NET приложениях, то в любом случае функционал выбора x86 или x64 пакетов должен находится в bootstrapper'е (как и функционал установки фреймворка нужной версии).
                                          +1
                                          Разве он с windows installer никак не связан?
                                          нет, не связан.

                                          // Для данного конкретного приложения не критично, но в контексте обсуждения инсталяторов вообще — это важно:
                                          Для Wix custom actions можно писать на c#, так что тут он даже лучше.
                                          Означает ли это, что у клиента должен быть .NET ??
                                            0
                                            нет, не связан.
                                            Ммм, значит удаление через стандартный механизм «Панель управления» — «Удаление программ» не предусмотрено? Или я туплю где-то?:)

                                            Означает ли это, что у клиента должен быть .NET ??
                                            Да, означает. Думаю для установки .NET приложений это само собой разумеется, и никаких проблем не вызовет. Все равно фреймворк будет заранее установлен с помощью bootstrapper'а.
                                            В то же время custom actions можно писать и на C++, в таком случае никаких ограничений нет.
                                              +1
                                              Ммм, значит удаление через стандартный механизм «Панель управления» — «Удаление программ» не предусмотрено? Или я туплю где-то?:)
                                              Тупишь ;-) Чтобы программу можно было из панели управления удалять — нужно ключик в реестре создать, больше ничего не надо. Inno setup с этой задачей справляется ;-)

                                              В то же время custom actions можно писать и на C++, в таком случае никаких ограничений нет.
                                              Так, я правильно понимаю, что эти custom actions — находятся во внешнем исполняемом файле и соответственно не имеют доступа к внутреннем структурам инсталятора?? Внутренний скриптовый язык в Wix'е есть?
                                              Например в Inno Setup я могу нарисовать дерево с чекбоксами и произвольным образом обработать выбранные пользователем узлы, в Wix'е такое возможно?
                                                0
                                                Тупишь ;-) Чтобы программу можно было из панели управления удалять — нужно ключик в реестре создать, больше ничего не надо. Inno setup с этой задачей справляется ;-)

                                                А, ну ок:) Я просто почему-то думал, что для того, чтобы программа там появилась, нужно чтобы она была прописана в таблицах Windows Installer'а. Уж не знаю с чего я это взял:).

                                                Например в Inno Setup я могу нарисовать дерево с чекбоксами и произвольным образом обработать выбранные пользователем узлы, в Wix'е такое возможно?

                                                Можно конечно. В Wix есть несколько стандартных диалогов, но можно добавлять свои или кастомизировать стандартные. Для разметки диалога используется XML, в нем описывается, какие события триггерятся при определенных действиях пользователя. На эти события можно в XML вешать обработчики. Причем не обязательно какой-то скрипт, в большинстве случаев можно обойтись стандартными действиями.
                                            0
                                            В Wix надо использовать богомерзкий XML и указывать каждый файлик в дистре.
                                              0
                                              Ну да, а что в этом плохого?:)
                                              Порядка больше получается.
                                                0
                                                На 241-м файлике насчет порядка закрадываются смутные сомнения.
                                                XML же малопригоден для чтения и редактирования человеком.
                                                  0
                                                  Да дело вкуса, на мой взгляд xml вполне читабелен.
                                            0
                                            А чем InnoSetup лучше Wix? По описанию они очень похожи.

                                            свободный и бесплатный
                                            Прямо как и Wix.

                                            модульный (не привязан к технологиям Microsoft)
                                            Всмысле не привязан? Windows Installer не используется?
                                            Wix также модульный, позволяет использовать разного рода плагины, и писать их самому.

                                            прозрачный (редактируется только текстовый скрипт, никакого визуального программирования, как, например, в Visual Studio Installer)
                                            Также как и Wix.

                                            как следствие, файлы инсталлера не пересоздаются при каждом изменении—нет проблем с системой контроля версий
                                            Само собой также как и Wix.

                                            гибкий (поддерживает скриптование с помощью Pascal/Delphi). До этого Delphi я видел последний раз лет 7 назад, на первом курсе института, но преимущества InnoSetup этот недостаток с лихвой компенсируют
                                            Wix позволяет писать custom actions на c#, что даже проще.

                                            ах да, он волшебным образом создает один файл установки для x32 и x64 версий
                                            Вот это круто, конечно. Но, с другой стороны, если мы говорим об установке .NET приложения, то в 99.99% случаев мы используем для установки bootstrapper (чтобы проверить наличие и установить сам фреймворк), так что обычно в bootstrapper'е же проверяется разрядность винды, и запускается нужный пакет.
                                              +1
                                              Дорогой модератор, прошу тебя удалить это сообщение:).
                                              Мой первый комментарий появился через 5 минут после отправки, прошу прощения за дубль.
                                              0
                                              — Error
                                              — You must be logged in as an administrator when installing this program.
                                              — ОК
                                              — Сделайте в инсталлере опцию установки в каталог пользователя.
                                                0
                                                Или просто дайте ссылку на zip-архив с программой. Я же не думаю, что ваша утилита что-то в реестр пишет или еще что-то, права администратора требующее, выполняет?
                                                +1
                                                (Unicode) NSIS тоже отличный инсталлер, кстати говоря.
                                                  0
                                                  Встроенный язык только полный отстой и прямые вызовы подпрограмм из dll, не оформленных как NSIS-плагины, делать не умеет.
                                                  0
                                                  Утилитка хороша, хотя в FAR'е я нахожу то, что мне нужно, чем NavigatorAssistant. Не холивара ради спрошу (ибо зацепило) — с чего вдруг .NET и WPF тормозные? В сравнении с чем? Имхо заявление весьма популистское и необоснованное. Тормозит не .NET, а код который на нем пишут
                                                    0
                                                    *в FAR'e нахожу быстрее
                                                      0
                                                      Ну как вам сказать… Для Win32 использовать девок (DevExpress) можно без раздумий о производительности, а для WPF эти же контролы добавляют ощутимые тормоза при старте.
                                                        0
                                                        Я года 3-4 до этого писал на .net (и сейчас пишу, как можно заметить :-) ), и тоже думал, что это правда.

                                                        Но все-таки это ненормально, когда пустое приложение на WPF поглощает 40-60 мб оперативной памяти сразу же (можете проверить, создав пустой проект в Visual Studio). Я пользуюсь еще классной утилитой Manic Time--с ней такая-же беда. Это что касается памяти.

                                                        Jit компиляция медленная--с этим даже Рихтер согласен (потому я добавил прекомпиляцию ngen в инсталлере, так же делает и Paint.Net, и Visual Studio, и Sql Server Management Studio).

                                                        Сборка мусора, я уверен, медленная. Есть вот такой open-source проект для моделирования гидродинамики (на C++): www.palabos.org/. Так вот, в нем _нигде_ не пользуются виртуальными функциями, только шаблонный полиморфизм, потому что виртуальные функции--это медленно (это я сам замерял тестами в своей программке для CFD). А garbage collection--это невероятно медленно.
                                                          0
                                                          Наверное, стоит уточнить — медленна прежде всего сборка мутабельного мусора. Для иммутабельных данных ее вполне можно сделать быстрой, что функциональные языки (откуда сборка мусора и пришла в мейнстрим) и показывают.
                                                            0
                                                            Я не вполне понимаю вас, к сожалению. В .Net сборка, по-моему, одинакова для любого типа мусора: три поколения, проход по ссылкам до стека (roots), очередь freachable, и т.п. И все эти манипуляции занимают какое-то время.
                                                              0
                                                              Я не про .NET — это императивная платформа, со всеми вытекающими.
                                                              А вот в том же функционально чистом хаскеле работа с кучей куда быстрее, чем в .NET, но условием служит жесткая гарантия неизменяемости львиной доли данных.
                                                              Дотнету же, как и яве, иногда приходится вспоминать о протекающих абстракциях и оптимизировать код под сборщик мусора.
                                                        0
                                                        Реквестирую возможность поиска нескольких папок по частям пути.
                                                        Я точно знаю, что у меня есть куча папок ZZZZ и искать просто по части имени ZZZZ мне не удобно (over 9000 results). При этом я точно знаю некоторые части пути к нужной папке ZZZZ, хотелось бы применить это знание.

                                                        Напрмер, при полных путях типа:
                                                        \works\aaaaaaa\bbbbbbb\zzzz
                                                        \works\ccccccccc\ddddddd\zzzz
                                                        \works\eeeeeee\uuuuuuu\zzzz
                                                        Очень хотелось бы чтобы я мог найти третий вариант набирая что-то вроде «wo*\eee*\*\zz», т.е. фильтрацию вариантов по маскам, а не только по левой части.

                                                        Но сейчас у меня так не получается :(

                                                        Когда будет возможность попробую сам допилить такую возможность, но кода это призойдет даже не представляю…
                                                          0
                                                          Да, я думал над такой возможностью, но решил пока не реализовывать--сохранить время для основного функционала. И я пока не решил, стоит ли оно того: если набирать такие сложные пути, то сам смысл использования утилитки теряется--проще зайти в эксплорер и дойти до нужной папки.

                                                          Но спасибо за фидбек!
                                                            0
                                                            Не знаю. Для меня это как раз основной юзкейс был бы. Бродить по папкам в проводнике в поисках нужной, даже если знаю как туда папасть, занимает непростительно много времени. Возможно я делаю что-то неправильно, но у меня обчно примонтировано до 15 разделов в которых очень много папок с довольно большой вложенностью, поэтому процесс навигации по ним утомляет. Думал нашел таблетку, но видимо придется готовить ее самому. Спасибо за платформу. ;)
                                                              0
                                                              Я буду только рад, если вы допишете этот функционал сами (нужно поменять только один класс, притом покрытый тестами) :-). А может быть, и у меня дойдут руки до этого--но не в ближайшее время.
                                                            0
                                                            Попробуйте Everything из комментов выше, там есть поиск с ипользованием полноценных регэкспов.
                                                            +1
                                                            Замечу, что в холиваре средств разработки инсталляторов нативность таких средств как Wix и Install Shield всегда являлась огромным плюсом, потому как иначе получить для приложения логотип «Certified for Windows» просто невозможно.
                                                            Использовать ради столь небольшого UI WPF мне кажется диким оверхедом, именно из-за тормозов на старте, от которых увы никуда не деться. Именно поэтому пишу софт с простым UI на WinForms, хоть и обожаю WPF.
                                                              0
                                                              Откровенно говоря, с WPF я преследовал еще и корыстный интерес--попробовать его после прочтения книжки и тестового проекта. Но теперь вынужден согласиться с вами--на WinForms было бы разрабатывать быстрее и проще, и само приложение было бы легковесней.

                                                              Мне показалось, что WPF, мягко говоря, все еще далеко не зрелый: многие вещи даже из WinForms не поддерживаются (например, отключение кнопок minimize и maximize в окошке); оказалось, что если в списке (ListBox) поставить width=auto, то ширина рассчитывается по _видимым_ элементам--то есть при скроллинге она может меняться, и сам скроллинг безумно медленный--пришлось ставить костыли. И миллион таких вещей.

                                                              Model-View-View Model даже для такого маленького приложения оказался недостаточным.
                                                                0
                                                                Угу — если лого нужен, то аргумент железный.
                                                                А вот если не нужен — то Install Shield пугает нехилой платностью, а Wix — челябинской суровостью.
                                                                  0
                                                                  Может я какой-то неправильный, но вдоволь поработав с nsis и Wix, при возможности я выбираю последний. Декларативность Wix требует больше времени для вхождения, но хорошо себя окупает.
                                                                    0
                                                                    Если выбирать между этими двумя, то конечно Wix лучше. NSIS — де-факто язык ассемблера.
                                                                    Но я предпочитаю InnoSetup — нормальный язык, в меру декларативные описания, легкий подхват процедур из dll.
                                                                    Функциональщину очень уважаю, но боже упаси, без xml.
                                                                +1
                                                                1. после установки она сразу нагло полезла сканировать все и вся, благо у меня не терабайты… предлагаю при первом запуске выдавать запрос на «контролируемые» диски/папки.

                                                                2. явно не хватает пункта настроек ExcludeFolders. при попытке добавления пути в Exclude template получаю весьма информативное сообщение «Exclude folder templates do not represent correct regular expressions»

                                                                p.s. а вообще идея отличная, пока оставил, возможно приживется.

                                                                  0
                                                                  а может и не приживется, имхо выжирание от 90 до 130 метров памяти постоянно запущенной программой это уже слишком, а ведь это даже не наглая рыжая морда, а изредка нужный ускоритель переходов…
                                                                    0
                                                                    Да, это действительно немало, я согласен)

                                                                    Выше в комментариях я писал, что частично это из-за wpf.

                                                                    Частично из-за того, что garbage collection не выполняется часто (на самом деле программа потребляет около 70 мегабайт), а каждый поиск добавляет 0-10 мегабайт (в зависимости от числа совпадений) (в следующих версиях я собираюсь запускать сборку мусора принудительно).

                                                                    И главное--кэш всех папок занимает очень много места, 40 мегабайт на моем компьютере (его можно оптимизировать и сократить в два раза, и даже больше), но для первой версии я решил этого не делать--хотелось посмотреть, понадобится ли она вообще кому-нибудь.
                                                                      0
                                                                      Делаем мелку пакость
                                                                      private bool ReadFullCache(bool appRunOnStartup) {
                                                                      return true; // а вот и не будем мы ничего читать )
                                                                      в результате развернутое из трея приложение занимает 11 метров… остальные 60 как понимаю уходят на in-memory кэш всех папок. а нужен ли он такой? возможно имеет смысл сваливать все это добро в некое хранилищие(не xml) и выгребать поиском по мере необходимости. постараюсь в ближайшие дни провести пару экспериментов по этому поводу.
                                                                    0
                                                                    А подскажите, какой путь вы вводите в «Exclude template»? (предполагается, что там будут не полные пути а-ля C:\Windows, а имена папок («Windows») или шаблоны имен папок («Win.*»)).
                                                                      0
                                                                      Хочется иметь возможность ввести именно полный путь. Некоторые имена папок(backup, client, server) дублируются, а исключить хочется именно необходимые. Есть конечно вариант именовать папки нужным образом, но как-то не по фэн-шую :)

                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                  Самое читаемое