Comparing a file mask to a file name?

Just starting out? Need help? Post your questions and find answers here.
pthien
Enthusiast
Enthusiast
Posts: 150
Joined: Sun Jun 29, 2003 9:39 pm

Comparing a file mask to a file name?

Post 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.
infratec
Always Here
Always Here
Posts: 7596
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Comparing a file mask to a file name?

Post by infratec »

Regulare Expressions :?:
AZJIO
Addict
Addict
Posts: 2152
Joined: Sun May 14, 2017 1:48 am

Re: Comparing a file mask to a file name?

Post 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")
AZJIO
Addict
Addict
Posts: 2152
Joined: Sun May 14, 2017 1:48 am

Re: Comparing a file mask to a file name?

Post 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$)
BarryG
Addict
Addict
Posts: 4155
Joined: Thu Apr 18, 2019 8:17 am

Re: Comparing a file mask to a file name?

Post by BarryG »

Windows only:

Code: Select all

file$="resume.docx"
Debug PathMatchSpec_(file$,"*re?u*.docx") ; 1
Debug PathMatchSpec_(file$,"*re?s*.docx") ; 0
pthien
Enthusiast
Enthusiast
Posts: 150
Joined: Sun Jun 29, 2003 9:39 pm

Re: Comparing a file mask to a file name?

Post by pthien »

Thank you all!

I'll try these out tonight.
Post Reply