It is possible to search with regex and filter by date and size.
You can choose the language (english, german) in tray menu.
You will need my library : Holles_Lib.ahk
And here is the script:
Code: Select all
SetWorkingDir,%A_ScriptDir%
#NoEnv
#Include Holles_Lib.ahk
IniRead,Language,FileSearch.ini,Options,Language,%A_Space%
if !Language
Language:="English"
gosub %Language%
Menu,tray,Icon,shell32.dll,23,1
Menu,tray,NoStandard
Menu,tray,add,,MenuHandler
Menu,tray,add,%TextChangeLanguage%,MenuHandler
Menu,tray,add,%TextClose%,MainGuiClose
CreateGui:
{
Gui,Main:Font,S12 cDefault,arial
Gui,Main:add,Text,x10 y15 w60,%TextFolder%:
IniRead,Folder,FileSearch.ini,Options,LastFolder,%A_Space%
temp:=Folder?Folder:TextChooseFolder
While(StrPixel(temp,"s12","Arial").width>294) ;reduce stringlength, if path is to long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
Gui,Main:add,Button,x70 y10 w300 gSelectFolder vSelectFolder,%temp%
Gui,Main:add,CheckBox,w300 Checked vSubFolder,%TextSubFolder%
Gui,Main:add,Text,x10 y90 w60 vTextSearch,%TextSearch%
Gui,Main:add,Edit,x70 yp-3 w300 gCheckValidStart vEditSearch
Gui,Main:add,Text,x70 y120 w70 vTextSearchIn,%TextSearchIn%
Gui,Main:add,Checkbox,x152 w110 yp Checked vCheckSearchName gCheckSearchName,%TextFileName%
Gui,Main:add,Checkbox,x270 w110 yp Checked vCheckSearchContent gCheckSearchContent,%TextFileContent%
Gui,Main:add,CheckBox,x70 y160 vCheckCS,a <> A
Gui,Main:add,CheckBox,x152 y160 vCheckRegEx,%TextRegexSearch%
Gui,Main:add,CheckBox,x70 y200 w140 gCheckFromCreated vCheckFromCreated,%TextFromCreated%
Gui,Main:add,DateTime,x+1 yp-3 w120 Section Disabled vEditFromCreated
Gui,Main:add,CheckBox,x70 y230 gCheckToCreated vCheckToCreated,%TextToCreated%
Gui,Main:add,DateTime,xs ys+30 w120 Disabled vEditToCreated
Gui,Main:add,CheckBox,x70 y270 w140 gCheckFromModified vCheckFromModified,%TextFromModified%
Gui,Main:add,DateTime,x+1 yp-3 w120 Section Disabled vEditFromModified
Gui,Main:add,CheckBox,x70 y300 gCheckToModified vCheckToModified,%TextToModified%
Gui,Main:add,DateTime,xs ys+30 w120 Disabled vEditToModified
Gui,Main:add,CheckBox,x70 y340 gCheckMin vCheckMin,%TextMinSize%
Gui,Main:add,Edit,x+1 yp-3 w60 Section Disabled gEditMin vEditMin
Gui,Main:add,Radio,x+5 y340 w35 vRadioMinByte Checked,B
Gui,Main:add,Radio,xp+35 yp w45 vRadioMinKilo,KB
Gui,Main:add,Radio,xp+45 yp vRadioMinMega,MB
Gui,Main:add,CheckBox,x70 y370 gCheckMax vCheckMax,%TextMaxSize%
Gui,Main:add,Edit,xs ys+30 w60 Disabled gEditMax vEditMax
Gui,Main:add,Radio,x+5 y370 w35 vRadioMaxByte Checked,B
Gui,Main:add,Radio,xp+35 yp w45 vRadioMaxKilo,KB
Gui,Main:add,Radio,xp+45 yp vRadioMaxMega,MB
Gui,Main:add,Button,x10 w360 gStartSearch vStartSearch Default Disabled,%TextStartSearch%
Gui,Main:show,w380,FileSearch
Return
}
StartSearch:
{
SearchAbort:=False
GuiControlGet,EditSearch,Main:
GuiControlGet,SubFolder,Main:
GuiControlGet,CheckSearchName,Main:
GuiControlGet,CheckSearchContent,Main:
GuiControlGet,CheckCS,Main:
GuiControlGet,CheckRegEx,Main:
GuiControlGet,CheckFromCreated,Main:
GuiControlGet,CheckToCreated,Main:
GuiControlGet,CheckFromModified,Main:
GuiControlGet,CheckToModified,Main:
GuiControlGet,CheckMin,Main:
GuiControlGet,CheckMax,Main:
if CheckFromCreated
GuiControlGet,EditFromCreated,Main:
if CheckToCreated
GuiControlGet,EditToCreated,Main:
if CheckFromModified
GuiControlGet,EditFromModified,Main:
if CheckToModified
GuiControlGet,EditToModified,Main:
if CheckMin {
GuiControlGet,EditMin,Main:
GuiControlGet,RadioMinKilo,Main:
GuiControlGet,RadioMinMega,Main:
if RadioMinKilo
EditMin*=1024
else if RadioMinMega
EditMin*=1048576
}
if CheckMax {
GuiControlGet,EditMax,Main:
GuiControlGet,RadioMaxKilo,Main:
GuiControlGet,RadioMaxMega,Main:
if RadioMaxKilo
EditMax*=1024
else if RadioMaxMega
EditMax*=1048576
}
Gui,Result:Destroy
Gui,Result:font,S12 cDefault,arial
Gui,Result:+ownerMain +AlwaysOnTop
Gui,Result:add,Text,x10 y10 vTextFoundInName,%TextFoundInName%
Gui,Result:add,ListBox,x10 yp+20 w600 r10 gListBox vLBName hwndhLBName
Gui,Result:add,Text,x10 y+20 vTextFoundInContent,%TextFoundInContent%
Gui,Result:add,ListBox,x10 yp+20 w600 r10 gListBox vLBContent hwndhLBContent
Gui,Result:Font,S12 cDefault,arial
Gui,Result:add,Text,x10 y+5 w600 vStatus
Gui,Result:add,Button,x120 y+10 w100 vTextOpen,%TextOpen%
Gui,Result:add,Button,x260 yp w100 Default vTextCancel,%TextCancel%
Gui,Result:add,Button,x400 yp w100 vTextClose,%TextClose%
Gui,Result:Font,S12 cTeal,arial
SetTimer,SearchIsRunning,500
Gui,Result:add,Text,x10 yp+5 w110 vRunning,%TextSearchIsRunning%
Gui,Result:show
OnMessage(0x200,"MouseOver") ;WM_MOUSEMOVE
Folder:=StrRight(Folder,1)="\"?Folder:Folder "\"
Loop,% Folder "*.*",,%SubFolder% ;check each file...
{
if SearchAbort
break
if (LastFolder!=A_LoopFileDir) {
LastFolder:=A_LoopFileDir,temp:=A_LoopFileFullPath
While(StrPixel(temp,"s12","Arial").width>600) ;reduce stringlength, if path is to long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
GuiControl,Result:,Status,%temp%
}
if (CheckFromCreated&&(StrLeft(EditFromCreated,8)>StrLeft(A_LoopFileTimeCreated,8)))
||(CheckToCreated&&(StrLeft(A_LoopFileTimeCreated,8)>StrLeft(EditToCreated,8)))
||(if CheckFromModified&&(StrLeft(EditFromModified,8)>StrLeft(A_LoopFileTimeModified,8)))
||(CheckToModified&&(StrLeft(A_LoopFileTimeModified,8)>StrLeft(EditToModified,8)))
||(CheckMin&&(EditMin>A_LoopFileSize))
||(CheckMax&&(A_LoopFileSize>EditMax))
continue
if CheckSearchName { ;search in file name...
HitNames:=CheckRegEx?RegExMatch(A_LoopFileName,CheckCS?EditSearch:"i)" EditSearch)?A_LoopFileFullPath:"":InStr(A_LoopFileName,EditSearch,CheckCS)?A_LoopFileFullPath:""
if HitNames&&(HitNames!=HitNamesBefore)
GuiControl,Result:,LBName,%HitNames%
HitNamesBefore:=HitNames
}
if CheckSearchContent { ;search in file content
file := FileOpen(A_LoopFileFullPath, "r")
HitContent:=CheckRegEx?RegExMatch(file.Read(),CheckCS?EditSearch:"i)" EditSearch)?A_LoopFileFullPath:"":InStr(file.Read(),EditSearch,CheckCS)?A_LoopFileFullPath:""
if HitContent&&(HitContent!=HitContentBefore) {
GuiControl,Result:,LBContent,%HitContent%
HitContentBefore:=HitContent
}
file.close()
}
}
SetTimer,SearchIsRunning,off
GuiControl,Result:,running
if SearchAbort {
Gui,Result:Font,S12 cRed,Arial
GuiControl,Result:Font,Status
GuiControl,Result:,Status,%TextSearchAborted%
}
else {
Gui,Result:Font,S12 cGreen,Arial
GuiControl,Result:Font,Status
GuiControl,Result:,Status,%TextSearchComplete%
}
return
}
SearchIsRunning:
{
Points:=!Points||(Points>4)?1:Points+1
GuiControl,Result:,running,% TextSearchIsRunning StringChain(".",Points)
return
}
SelectFolder:
{
Gui +OwnDialogs
IniRead,Folder,FileSearch.ini,Options,LastFolder,%A_Space%
FileSelectFolder,Folder,*%Folder%,,%TextChooseFolder%
if !Folder {
GuiControl,Main:,SelectFolder,%TextChooseFolder%
return
}
IniWrite,%Folder%,FileSearch.ini,Options,LastFolder
GuiControl,Main:-Disabled,StartSearch
temp:=Folder
While(StrPixel(temp,"s12","Arial").width>294) ;reduce string length if path is too long for the button
temp:=StrLeft(temp,3) "..." StrTrimLeft(temp,a_index)
GuiControl,Main:,SelectFolder,%temp%
return
}
CheckFromCreated:
{
GuiControlGet,CheckFromCreated,Main:
if CheckFromCreated {
GuiControl,Main:-Disabled,EditFromCreated
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditFromCreated
gosub CheckValidStart
}
return
}
CheckToCreated:
{
GuiControlGet,CheckToCreated,Main:
if CheckToCreated {
GuiControl,Main:-Disabled,EditToCreated
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditToCreated
gosub CheckValidStart
}
return
}
CheckFromModified:
{
GuiControlGet,CheckFromModified,Main:
if CheckFromModified {
GuiControl,Main:-Disabled,EditFromModified
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditFromModified
gosub CheckValidStart
}
return
}
CheckToModified:
{
GuiControlGet,CheckToModified,Main:
if CheckToModified {
GuiControl,Main:-Disabled,EditToModified
GuiControl,Main:-Disabled,StartSearch
}
else {
GuiControl,Main:Disable,EditToModified
gosub CheckValidStart
}
return
}
CheckMin:
{
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
if CheckMin
GuiControl,Main:-Disabled,EditMin
else
GuiControl,Main:Disable,EditMin
if CheckMin&&EditMin
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
CheckMax:
{
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if CheckMax
GuiControl,Main:-Disabled,EditMax
else
GuiControl,Main:Disable,EditMax
if CheckMax&&EditMax
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
EditMin:
{
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
if CheckMin&&EditMin
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
EditMax:
{
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if CheckMax&&EditMax
GuiControl,Main:-Disabled,StartSearch
else
gosub CheckValidStart
return
}
CheckValidStart:
{
GuiControlGet,EditSearch,Main:
GuiControlGet,CheckFromCreated,Main:
GuiControlGet,CheckToCreated,Main:
GuiControlGet,CheckFromModified,Main:
GuiControlGet,CheckToModified,Main:
GuiControlGet,CheckMin,Main:
GuiControlGet,EditMin,Main:
GuiControlGet,CheckMax,Main:
GuiControlGet,EditMax,Main:
if EditSearch||CheckFromCreated||CheckToCreated||CheckFromModified||CheckToModified||(CheckMin&&EditMin)||(CheckMax&&EditMax)
GuiControl,Main:-Disabled,StartSearch
else
GuiControl,Main:Disable,StartSearch
return
}
CheckSearchName:
CheckSearchContent:
{
GuiControlGet,CheckSearchName,Main:
GuiControlGet,CheckSearchContent,Main:
if !CheckSearchName&&!CheckSearchContent
GuiControl,Main:,%A_GuiControl%,1
return
}
ResultGuiClose:
ResultButtonBeenden:
ResultButtonClose:
ResultButtonAbbrechen:
ResultButtonCancel:
{
SearchAbort:=True
If (A_GuiControl="TextCancel") {
GuiControl,Result:Disable,TextCancel
return
}
OnMessage(0x200,"") ;WM_MOUSEMOVE
ToolTip
Gui,Result:Destroy
return
}
ResultButtonÖffnen:
ResultButtonOpen:
{
Gui,Result:-AlwaysOnTop
Gui,Result:+OwnDialogs
GuiControlGet,LBName,Result:
GuiControlGet,LBContent,Result:
if LBName
Run,%LBName%
else if LBContent
Run,%LBContent%
return
}
ListBox:
{
GuiControlGet,LBName,Result:
GuiControlGet,LBContent,Result:
if (A_GuiControl="LBName")&&LBName
GuiControl,Choose,ListBox2,0
else if (A_GuiControl="LBContent")&&LBContent
GuiControl,Choose,ListBox1,0
if (A_GuiEvent = "DoubleClick")
gosub ResultButtonOpen
return
}
MenuHandler:
{
Language:=A_ThisMenuItem="Change to English"?"English":"Deutsch"
Menu,Tray,Rename,%A_ThisMenuItem%,% Language="English"?"Zu Deutsch wechseln":"Change to English"
Menu,Tray,Rename,%TextClose%,% Language="English"?"Close":"Beenden"
IniWrite,%Language%,FileSearch.ini,Options,Language
gosub %Language%
return
}
Deutsch:
{
TextClose:="Beenden"
TextChangeLanguage:="Change to English"
TextFolder:="Ordner"
TextChooseFolder:="Bitte einen Ordner auswählen..."
TextSubFolder:="Unterordner einbeziehen"
TextSearch:="Suchen:"
TextSearchIn:="Suche im:"
TextFileName:="Datei-Name"
TextFileContent:="Datei-Inhalt"
TextRegexSearch:="RegEx-Suche"
TextFromCreated:="Vom (Erstellt)"
TextToCreated:="Bis (Erstellt)"
TextFromModified:="Vom (Modifiziert)"
TextToModified:="Bis (Modifiziert)"
TextMinSize:="Min. Größe"
TextMaxSize:="Max. Größe"
TextStartSearch:="Suche starten"
TextFoundInName:="Gefunden in Dateinamen:"
TextFoundInContent:="Gefunden im Datei-Inhalt:"
TextOpen:="Öffnen"
TextCancel:="Abbrechen"
TextSearchIsRunning:="Suche läuft"
TextSearchAborted:="Die Suche wurde abgebrochen!"
TextSearchComplete:="Die Suche ist abgeschlossen!"
gosub RefreshGui
return
}
English:
{
TextClose:="Close"
TextChangeLanguage:="Zu Deutsch wechseln"
TextFolder:="Folder"
TextChooseFolder:="Please choose a folder..."
TextSubFolder:="Include subfolders"
TextSearch:="Search:"
TextSearchIn:="Search in:"
TextFileName:="File name"
TextFileContent:="File content"
TextRegexSearch:="RegEx Search"
TextFromCreated:="From (Created)"
TextToCreated:="To (Created)"
TextFromModified:="From (Modified)"
TextToModified:="To (Modified)"
TextMinSize:="Min. size"
TextMaxSize:="Max. size"
TextStartSearch:="Start search!"
TextFoundInName:="Found in file name:"
TextFoundInContent:="Found in file content:"
TextOpen:="Open"
TextCancel:="Cancel"
TextSearchIsRunning:="Searching"
TextSearchAborted:="Search is aborted!"
TextSearchComplete:="Search is complete!"
gosub RefreshGui
return
}
RefreshGui:
{
if !Folder
GuiControl,Main:,SelectFolder,%TextChooseFolder%
GuiControl,Main:,SubFolder,%TextSubFolder%
GuiControl,Main:,TextSearch,%TextSearch%
GuiControl,Main:,TextSearchIn,%TextSearchIn%
GuiControl,Main:,CheckSearchName,%TextFileName%
GuiControl,Main:,CheckSearchContent,%TextFileContent%
GuiControl,Main:,CheckRegEx,%TextRegexSearch%
GuiControl,Main:,CheckFromCreated,%TextFromCreated%
GuiControl,Main:,CheckToCreated,%TextToCreated%
GuiControl,Main:,CheckFromModified,%TextFromModified%
GuiControl,Main:,CheckToModified,%TextToModified%
GuiControl,Main:,CheckMin,%TextMinSize%
GuiControl,Main:,CheckMax,%TextMaxSize%
GuiControl,Main:,StartSearch,%TextStartSearch%
GuiControlGet,Status,Result:
If Status { ;Gui "Result" is open
GuiControl,Result:,TextFoundInName,%TextFoundInName%
GuiControl,Result:,TextFoundInContent,%TextFoundInContent%
GuiControl,Result:,TextOpen,%TextOpen%
GuiControl,Result:,TextCancel,%TextCancel%
GuiControl,Result:,TextClose,%TextClose%
if SearchAbort
GuiControl,Result:,Status,%TextSearchAborted%
else if !IsIn(SearchIsRunning,GetTimer().names) ;timer is not active... search is complete!
GuiControl,Result:,Status,%TextSearchComplete%
}
return
}
MainGuiClose:
ExitApp
MouseOver() {
global hLBContent,hLBName
static TextBefore
MouseGetPos,,ypos
if (A_GuiControl = "LBName") {
StartRow:=LB_GETTOPINDEX(hLBName)
GuiControlGet,LBName,Pos
yPos-=26+LBNameY
ControlGet,Hits,List,,ListBox1,A
}
else if (A_GuiControl = "LBContent") {
StartRow:=LB_GETTOPINDEX(hLBContent)
GuiControlGet,LBContent,Pos
yPos-=26+LBContentY
ControlGet,Hits,List,,ListBox2,A
}
else {
TextBefore:=""
ToolTip
return
}
Row:=Ceil(yPos/18)+StartRow-1
StringSplit,Text,Hits,`n
Text:=Text%Row%
if (Text!=TextBefore)
ToolTip %Text%
TextBefore:=Text
return
}
LB_GETTOPINDEX(HWND) { ;by hd0202
; LB_GETTOPINDEX = 0x018E -> msdn.microsoft.com/en-us/library/bb761317(v=vs.85).aspx
Return (DllCall("User32.dll\SendMessage", "Ptr", HWND, "UInt", 0x018E, "Ptr", 0, "Ptr", 0, "Ptr") + 1)
}
Pause::Pause