Page 1 of 1

Comparing a file mask to a file name?

Posted: Wed Aug 06, 2025 1:40 am
by pthien
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.

Re: Comparing a file mask to a file name?

Posted: Wed Aug 06, 2025 6:47 am
by infratec
Regulare Expressions :?:

Re: Comparing a file mask to a file name?

Posted: Wed Aug 06, 2025 7:08 am
by AZJIO
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?

Posted: Wed Aug 06, 2025 8:45 am
by AZJIO

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$)
Test of behavior

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?

Posted: Wed Aug 06, 2025 9:40 am
by BarryG
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?

Posted: Wed Aug 06, 2025 1:56 pm
by pthien
Thank you all!

I'll try these out tonight.