Moin Moin,
ich hoffe ihr könnt mir mal auf die schnelle helfen.
Ich möchte gerne alle Dateien aus einem String rausfiltern.
z.B:
Gibt es eine passende Funktion in der Win API oder ähnliches?
Hier meine Manuelle such-funktion:
Spoiler anzeigen
Meine Funktion funktoniert super, halt nur nicht wenn Leerzeichen im Path sind (Shell *hust*), und der Path nicht in Anführungzeichen ist (Funktioniert: "C:\Program Files\App.exe" aber nicht: C:\Program Files\App.exe)
~MfG
ich hoffe ihr könnt mir mal auf die schnelle helfen.
Ich möchte gerne alle Dateien aus einem String rausfiltern.
z.B:
C:\Dir\Dir\App.exe -Arg1
(Rausfiltern: C:\Dir\Dir\App.exe)
\??\C:\Dir\Dir\App.exe -Arg1 C:\MahText.txt
(Rausfiltern: C:\Dir\Dir\App.exe, C:\MahText.txt)
Nur beispiele wie ich dass meine.App.exe -Arg1 %WinDir%\Explorer.exe %SystemRoot%\System32\RunDLL32.exe
(Rausfiltern: C:\Windows\System32\App.exe, C:\Windows\Explorer.exe, C:\Windows\System32\RunDLL32.exe)
Gibt es eine passende Funktion in der Win API oder ähnliches?
Hier meine Manuelle such-funktion:
VB.NET-Quellcode
- Option Strict On
- Imports System.Text.RegularExpressions
- Imports System.Text
- Imports System.Runtime.InteropServices
- Public Class Form1
- <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
- Public Shared Function SearchPath(ByVal path As String, ByVal fileName As String, ByVal extension As String, ByVal numBufferChars As Integer, ByVal buffer As StringBuilder, ByVal filePart As Integer()) As Integer
- End Function
- Function SearchFile(ByRef sFile As String) As String
- Dim nResult As Long
- Dim sBuffer As New StringBuilder(280)
- nResult = SearchPath(Nothing, sFile, Nothing, 280, sBuffer, Nothing)
- If nResult > 0 Then
- Return sBuffer.ToString
- Else
- Return ""
- End If
- End Function
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- '############# AUFRUF #############
- TextBox3.Text = String.Join(vbNewLine, CleanPath(TextBox1.Text))
- '############# AUFRUF #############
- End Sub
- Function CleanPath(ByVal sPath As String) As String()
- For Each s As String In {" ", "!\??", "\??", "@"}
- While (sPath.StartsWith(s))
- sPath = sPath.Remove(0, s.Length)
- End While
- Next
- Static SYSTEM_PATH As String = Environment.GetFolderPath(Environment.SpecialFolder.System)
- Static WINDOWS_PATH As String = SYSTEM_PATH.Replace("\system32", "")
- If sPath.StartsWith("\systemroot", StringComparison.CurrentCultureIgnoreCase) Then
- sPath = SYSTEM_PATH & "" & sPath.Remove(0, "\systemroot".Length)
- End If
- For Each s As String In RegExMatchList(sPath, "\%(.*?)\%", RegexOptions.IgnoreCase)
- s = s.Replace("%", "")
- If (String.IsNullOrEmpty(s)) Then Continue For
- Dim sVarPath As String = Environment.GetEnvironmentVariable(s)
- If (String.IsNullOrEmpty(sVarPath)) Then sVarPath = ""
- sPath = sPath.Replace("%" & s & "%", sVarPath)
- Next
- Dim aList As New List(Of String)
- Dim isMark As Boolean = False
- Dim SB As New StringBuilder
- For Each s As String In sPath.Split(CChar(" "))
- If (String.IsNullOrEmpty(s)) Then Continue For
- Dim iMarks As Integer = s.Split(CChar("""")).Length - 1
- If (StrContains(s, """", False) AndAlso iMarks = 1) Then
- isMark = (Not isMark)
- ElseIf (iMarks > 1) Then
- s = s.Replace("""", "")
- If (FileExist(s)) Then
- aList.Add(SearchFile(s))
- End If
- Continue For
- End If
- If (isMark) Then
- SB.Append(s & " ")
- ElseIf (SB.Length > 0) Then
- SB.Append(s)
- SB.Replace("""", "")
- If (FileExist(SB.ToString)) Then
- aList.Add(SearchFile(SB.ToString))
- End If
- SB.Length = 0
- End If
- If (FileExist(s)) Then
- aList.Add(SearchFile(s))
- End If
- Next
- Return aList.ToArray
- End Function
- Function RegExMatch(ByVal Text As String, ByVal Filter1 As String, ByVal Options As RegexOptions) As String
- For Each m As Match In Regex.Matches(Text, Filter1, Options)
- Return m.Value
- Next
- Return ""
- End Function
- Function RegExMatchList(ByVal Text As String, ByVal Filter1 As String, ByVal Options As RegexOptions) As String()
- Dim aList As New List(Of String)
- For Each m As Match In Regex.Matches(Text, Filter1, Options)
- aList.Add(m.Value)
- Next
- Return aList.ToArray
- End Function
- Function FileExist(ByRef sFile As String, Optional ByVal bSearchFor As Boolean = True) As Boolean
- If (bSearchFor) Then
- Return (IO.File.Exists(sFile) OrElse IO.File.Exists(SearchFile(sFile)))
- Else
- Return IO.File.Exists(sFile)
- End If
- End Function
- Function StrEqual(ByRef sString1 As String, ByRef sString2 As String, Optional ByVal bCaseSensivite As Boolean = True) As Boolean
- If (bCaseSensivite) Then
- Return String.Equals(sString1, sString2, StringComparison.CurrentCulture)
- Else
- Return String.Equals(sString1, sString2, StringComparison.CurrentCultureIgnoreCase)
- End If
- End Function
- Function StrContains(ByRef sString1 As String, ByRef sString2 As String, Optional ByVal bCaseSensivite As Boolean = True) As Boolean
- If (bCaseSensivite) Then
- Return (sString1.IndexOf(sString2, 0, StringComparison.CurrentCulture) > -1)
- Else
- Return (sString1.IndexOf(sString2, 0, StringComparison.CurrentCultureIgnoreCase) > -1)
- End If
- End Function
- End Class
Meine Funktion funktoniert super, halt nur nicht wenn Leerzeichen im Path sind (Shell *hust*), und der Path nicht in Anführungzeichen ist (Funktioniert: "C:\Program Files\App.exe" aber nicht: C:\Program Files\App.exe)
~MfG