Checks if name matches pattern with '?' and '*' wildcards.
/*
* Filename: FileUtil.cs
* Product: Versioning Controlled Build
* Solution: BuildAutoIncrement
* Project: Shared
* Description: File utility methods.
* Copyright: Julijan ?ribar, 2004-2007
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the author(s) be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace BuildAutoIncrement {
/// <summary>
/// A set of file utilities.
/// </summary>
public struct FileUtil {
/// <summary>
/// Checks if name matches pattern with '?' and '*' wildcards.
/// </summary>
/// <param name="filename">
/// Name to match.
/// </param>
/// <param name="pattern">
/// Pattern to match to.
/// </param>
/// <returns>
/// <c>true</c> if name matches pattern, otherwise <c>false</c>.
/// </returns>
public static bool FilenameMatchesPattern(string filename, string pattern) {
// prepare the pattern to the form appropriate for Regex class
StringBuilder sb = new StringBuilder(pattern);
// remove superflous occurences of "?*" and "*?"
while (sb.ToString().IndexOf("?*") != -1) {
sb.Replace("?*", "*");
}
while (sb.ToString().IndexOf("*?") != -1) {
sb.Replace("*?", "*");
}
// remove superflous occurences of asterisk '*'
while (sb.ToString().IndexOf("**") != -1) {
sb.Replace("**", "*");
}
// if only asterisk '*' is left, the mask is ".*"
if (sb.ToString().Equals("*"))
pattern = ".*";
else {
// replace '.' with "\."
sb.Replace(".", "\\.");
// replaces all occurrences of '*' with ".*"
sb.Replace("*", ".*");
// replaces all occurrences of '?' with '.*'
sb.Replace("?", ".");
// add "\b" to the beginning and end of the pattern
sb.Insert(0, "\\b");
sb.Append("\\b");
pattern = sb.ToString();
}
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.IsMatch(filename);
}
}
}
Related examples in the same category