I did a quick search of the help and the forum and didn't find anything.
Does PureBasic provide a means of comparing a string containing a filename, to a mask?
That is, something like:
IsFileMask("*re?u*.docx","resume.docx"
...would return TRUE because they match.
IsFileMask("*re?s*.docx","resume.docx"
...would return FALSE because they don't.
Thanks in advance.
Comparing a file mask to a file name?
Re: Comparing a file mask to a file name?
Regulare Expressions 

Re: Comparing a file mask to a file name?
CorrectMask
Code: Select all
EnableExplicit
Procedure IsFileMask(Mask$, FileName$)
Protected hRE
If Mask$ = "|" ; Mask error when using CorrectMask()
ProcedureReturn 3
EndIf
Mask$ = ReplaceString(Mask$, "[", "\[")
Mask$ = ReplaceString(Mask$, "]", "\]")
Mask$ = ReplaceString(Mask$, "$", "\$")
Mask$ = ReplaceString(Mask$, "^", "\^")
Mask$ = ReplaceString(Mask$, ".", "\.")
Mask$ = ReplaceString(Mask$, "{", "\{")
Mask$ = ReplaceString(Mask$, "}", "\}")
Mask$ = ReplaceString(Mask$, "(", "\(")
Mask$ = ReplaceString(Mask$, ")", "\)")
Mask$ = ReplaceString(Mask$, "+", "\+")
Mask$ = ReplaceString(Mask$, "?", ".")
Mask$ = ReplaceString(Mask$, "*", ".*?")
hRE = CreateRegularExpression(#PB_Any, "\A(" + Mask$ + ")\z", #PB_RegularExpression_NoCase)
If Not hRE
ProcedureReturn 2
EndIf
If MatchRegularExpression(hRE, FileName$)
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure
Define Mask$
Mask$ = "*re?u*.docx"
; Mask$ = CorrectMask(Mask$)
Debug IsFileMask(Mask$,"resume.docx")
Mask$ = "*re?s*.docx"
; Mask$ = CorrectMask(Mask$)
Debug IsFileMask(Mask$,"resume.docx")
Re: Comparing a file mask to a file name?
Code: Select all
EnableExplicit
#success = 1
#not_success = 0
Procedure IsFileMask(*f.Character, *m.Character)
Protected flgM
While *f\c And (*m\c Or flgM)
If flgM = 1
*m + SizeOf(Character)
If *m\c = 0 ; множество в конце, маска совпадает
ProcedureReturn #success
ElseIf *m\c = '*' Or *m\c = '?'
Continue
EndIf
flgM = 2
Continue
ElseIf flgM = 2
While *f\c
If *f\c = *m\c
flgM = 0
Break
EndIf
*f + SizeOf(Character)
Wend
If *f\c = 0 ; совпадение после множества не найдено
ProcedureReturn #not_success
EndIf
EndIf
If *f\c = *m\c Or *m\c = '?'
*f + SizeOf(Character)
*m + SizeOf(Character)
Continue
ElseIf *m\c = '*'
flgM = 1
Else
ProcedureReturn #not_success
EndIf
Wend
If *f\c = 0 And *m\c = 0
ProcedureReturn #success
EndIf
ProcedureReturn #not_success
EndProcedure
Define FileName$, Mask$
FileName$ = "resume.docx"
Mask$ = "*re?u*.docx"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "*re?s*.docx"
Debug IsFileMask(@FileName$, @Mask$)
Code: Select all
Debug "—————success————"
FileName$ = "0123456789"
Mask$ = "0123?56?89"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "01*3?56?89"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "01*23?56?89"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "*6789"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "01234*"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "01234*6789"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "0123***456789"
Debug IsFileMask(@FileName$, @Mask$)
Debug "—————not_success————"
Mask$ = "*678"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "1234*"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "1234*678"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "012356789"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "123456789"
Debug IsFileMask(@FileName$, @Mask$)
Mask$ = "012345678"
Debug IsFileMask(@FileName$, @Mask$)
Debug "—————Error————"
Mask$ = "0123***??6789"
Debug IsFileMask(@FileName$, @Mask$)
Re: Comparing a file mask to a file name?
Windows only:
Code: Select all
file$="resume.docx"
Debug PathMatchSpec_(file$,"*re?u*.docx") ; 1
Debug PathMatchSpec_(file$,"*re?s*.docx") ; 0
Re: Comparing a file mask to a file name?
Thank you all!
I'll try these out tonight.
I'll try these out tonight.