.NET에서 Windows API 함수 PathMatchSpec()
과 동일한 기능이 있는지 아는 사람이 있습니까?PathMatchSpec for .NET에 해당합니다.
답변
정규 표현식을 사용하여 기능을 구현할 수 없다면 (이 경우에 해당한다고 생각합니다) PInvoke를 통해 PathMatchSpec()을 사용하는 것이 어떻습니까?
http://www.pinvoke.net/default.aspx/shlwapi/PathMatchSpec.html
당신은 How to implement glob in C# 을 시도 할 수 있습니다 또는 필요한 경우 물론 PInvoke route이 있습니다. 내가 .NET으로 내장하는 방법을 잘 모르는 것 같아요
그러나 그것은 정규식과 중복 사소한 :
public static bool PathMatchSpec(String path, String spec)
{
String specAsRegex = Regex.Escape(spec).Replace("\\*", ".*").Replace("\\?", ".") + "$";
return Regex.IsMatch(path, specAsRegex);
}
는 분명히 이것은들을 System.Text.RegularExpression 네임 스페이스 참조 가정합니다. 동일한 사양으로이 작업을 수행하려는 경우 Regex도 캐시 할 수 있습니다.
편집 추가 : P/Invoke는 실제로 옵션이지만 PathMatchSpec의 서명은 ANSI 문자열을 사용한다는 것을 나타내므로 각 호출에 대한 문자 집합 변환이 발생합니다. 그 길로 가면 명심하십시오. 이 경우 PathMatchSpecEx이 더 바람직 할 것입니다. 한마디로
... 나는의 ... 알고하지만 어쩌면이 함께 당신을 도울 수 (당신이 원하는 것보다 조금 더 긴 노트,하지만 나를 잘 역임했다)하지 않는 것이 :
sealed public class WildcardMatch
{
private static Regex wildcardFinder = new Regex(@"(?<wildcards>\?+|\*+)", RegexOptions.Compiled | RegexOptions.Singleline);
private Regex wildcardRegex;
public WildcardMatch(string wildcardFormat) : this(wildcardFormat, false) { }
public WildcardMatch(string wildcardFormat, bool ignoreCase)
{
if (wildcardFormat == null)
throw new ArgumentNullException("wildcardFormat");
StringBuilder patternBuilder = new StringBuilder("^");
MatchCollection matches = this.wildcardFinder.Matches(wildcardFormat);
string[] split = this.wildcardFinder.Split(wildcardFormat);
for (int ix = 0; ix < split.Length; ix++)
{
// Even indexes are literal text, odd indexes correspond to matches
if (ix % 2 == 0)
patternBuilder.Append(Regex.Escape(split[ix]));
else
{
// Matches must be substituted with Regex control characters
string wildcards = matches[ix/2].Groups["wildcards"].Value;
if (wildcards.StartsWith("*", StringComparison.Ordinal))
patternBuilder.Append("(.*)");
else
patternBuilder.AppendFormat(CultureInfo.InvariantCulture, "({0})", wildcards.Replace('?', '.'));
}
}
patternBuilder.Append("$");
this.wildcardRegex = new Regex(
patternBuilder.ToString(),
RegexOptions.Singleline | (ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None));
}
public bool IsMatch(string value)
{
if (value == null)
return false;
return this.wildcardRegex.IsMatch(value);
}
public IEnumerable<string> ExtractMatches(string value)
{
if (value == null)
yield break;
Match match = this.wildcardRegex.Match(value);
if (!match.Success)
yield break;
for (int ix = 1; ix < match.Groups.Count; ix++)
yield return match.Groups[ix].Value;
}
}
anelsons 'Regex.Escape()'를 사용하여 이스케이프 코드를 확실히 단순화 할 수 있습니다. – jerryjvl
- 1. Java의 DataSource .net에 해당합니다.
- 2. Business Logic Toolkit for .NET에 대한 의견이 있으십니까?
- 3. Delphi 2007 for .NET에 최신 Indy10을 어떻게 설치합니까?
- 4. 코드가 Html.EditorFor()에 해당합니다.
- 5. Python for Python에서 CLR에 액세스하기위한 IronPython, Python for .NET에 대한 대안은 무엇입니까?
- 6. 하스켈에서의 python eval에 해당합니다.
- 7. IIS6에 대한 SF_NOTIFY_READ_RAW_DATA에 해당합니다.
- 8. DataRelation은 Subsonic 3에 해당합니다.
- 9. .NET은 GetLastInputInfo에 해당합니다?
- 10. 배열의 "stringByDeletingPathExtension"에 해당합니다.
- 11. CRTDBG_MAP_ALLOC는 AIX의 xlC에 해당합니다.
- 12. 스키마의 defsetf에 해당합니다.
- 13. Python의 LinkedHashMap에 해당합니다.
- 14. Java가 .Net의 NotSupportedException에 해당합니다.
- 15. EasyMock의 LastCall.IgnoreArguments에 해당합니다.
- 16. .NET에 System.ClassNotFoundException이없는 이유는 무엇입니까?
- 17. Datamining for .NET
- 18. bash의 select 또는 poll에 해당합니다.
- 19. 하스켈 OCaml의 형식 라이브러리에 해당합니다.
- 20. Spring Framework의 리소스 추상화에 해당합니다.
- 21. C#의 VB 형식에 해당합니다.
- 22. Android의 addJavascriptInterface는 iOS에서 이에 해당합니다.
- 23. didSendBodyData는 iphone 펌웨어 2.2.1에 해당합니다.
- 24. .Net 객체가 IronRuby 해시에 해당합니다.
- 25. Clojure의 Python "dir"에 해당합니다.
- 26. .net Java의 Swing TableModel에 해당합니다.
- 27. .NET에 동등한 JMS가 있습니까?
- 28. . NET에 상응하는 MSXML2.XMLHTTP40
- 29. SAP를 .NET에 연결하기위한 옵션
- 30. .net에 대한 SASL 라이브러리
쿨 ... Escape() 메서드에 대해 몰랐습니다.) 내 솔루션의 일부를 명확하게 단순화 할 것이다;) – jerryjvl