Я получаю исключение «недопустимые символы в пути», но в строке нет недопустимых символов.
Как я могу решить эту проблему?:
Private Sub Button_Send_Click(sender As Object, e As EventArgs) Handles Button_Send.Click
For Each item As ListViewItem In ListView1.Items
Clipboard.SetText(item.SubItems(0).Text)
' First I copy the text to the clipboard to ensure in Explorer.exe if all is ok and also ifthe file exists... and yes, it exists.
' The example text is this:
' C:\Electro\Nueva carpeta\Aggresivnes - Dance Or Die.mp3
' (without any quotes)
' ...But this throws an "not exists":
If IO.File.Exists(item.SubItems(0).Text) Then MsgBox("exists") Else MsgBox("not exists")
' And here throws an exception of "*Illegal characters in path*" :
Dim File As New IO.FileInfo(item.SubItems(0).Text)
Next
End Su
ОБНОВЛЕНИЕ 2
Я сделал ошибку в своем собственном коде, не заметил, что он возвращает true, когда нет проблем, и возвращает false, когда проблема существует, поэтому я решил удалить свое старое обновление и отредактировать это:
Я сделал функцию, чтобы проверить (снова), если преобразование имени файла или что-то в строковой переменной имеет какой-либо недопустимый символ, следуя указаниям ответа @Jim Mischel:
#Region " Validate Windows FileName "
' [ Validate Windows FileName Function ]
'
' By Elektro H@cker
'
' Examples :
' MsgBox(Validate_Windows_FileName("C:\Test.txt")) ' Result: True
' MsgBox(Validate_Windows_FileName("C:\Te|st.txt")) ' Result: False
Private Function Validate_Windows_FileName(ByRef FileName As String)
Dim Directory As String = Nothing
Dim File As String = Nothing
Try
Directory = FileName.Substring(0, FileName.LastIndexOf("\")) & "\"
File = FileName.Split("\").Last
Catch
If Directory Is Nothing Then File = FileName
End Try
If Directory Is Nothing AndAlso File Is Nothing Then Return False
If Not Directory Is Nothing Then
For Each InvalidCharacter As Char In IO.Path.GetInvalidPathChars
If Directory.Contains(InvalidCharacter) Then
' MsgBox(InvalidCharacter)
Return False
End If
Next
End If
If Not File Is Nothing Then
For Each InvalidCharacter As Char In IO.Path.GetInvalidFileNameChars
If File.Contains(InvalidCharacter) Then
' MsgBox(InvalidCharacter)
Return False
End If
Next
End If
Return True ' FileName is valid
End Function
#End Region
ну... теперь я использую эту функцию, чтобы снова убедиться, что полный путь/имя файла и результат "false", что означает, что строка содержит недопустимый символ, и этот символ является чем-то вроде "пробела".
MsgBox(Validate_Windows_FileName(item.SubItems(0).Text))
Я не знаю, как это решить.
Если вы хотите увидеть весь класс, вот:
Public Class Main
Dim WinAmpTitle As String = String.Empty
Dim WinAmpFile As String = String.Empty
Dim Sendto_Path As String
Dim WithEvents WinAmp_Timer As New Timer With {.Interval = 25, .Enabled = True}
Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Nothing to do here at the momento...
End Sub
Private Sub WinAmp_Timer_Tick(sender As Object, e As EventArgs) Handles WinAmp_Timer.Tick
WinAmpTitle = WinAmpInfo.Title
WinAmpFile = WinAmpInfo.FileName
If Not TextBox_Title.Text = WinAmpTitle Then TextBox_Title.Text = WinAmpTitle
If Not TextBox_Filename.Text = WinAmpFile Then TextBox_Filename.Text = WinAmpFile
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button_Copy.Click
Dim item = ListView1.Items.Add(WinAmpFile)
item.SubItems.Add(ComboBox_Sendto.Text)
End Sub
Private Sub Button_Send_Click(sender As Object, e As EventArgs) Handles Button_Send.Click
For Each item As ListViewItem In ListView1.Items
Clipboard.SetText(item.SubItems(0).Text)
' First I copy the text to the clipboard to ensure in Explorer.exe if the file exists... and yes, it exists.
' The example text is this:
' C:\Electro\Nueva carpeta\Aggresivnes - Dance Or Die.mp3
' (without any quotes)
' ...But this throws an "not exists":
If IO.File.Exists(item.SubItems(0).Text) Then MsgBox("exists") Else MsgBox("not exists")
MsgBox(Validate_Windows_FileName(item.SubItems(0).Text)) ' Result: False (any invalid character)
' Here, an exception: "Illegal characters in path" :
Dim File As New IO.FileInfo(item.SubItems(0).Text)
' If item.SubItems(1).Text.ToLower = "electro" Then Sendto_Path = "C:\Electro"
' If item.SubItems(1).Text.ToLower = "techno" Then Sendto_Path = "C:\Techno"
' If item.SubItems(1).Text.ToLower = "trance" Then Sendto_Path = "C:\Trance"
'IO.File.Copy(File.FullName, IO.Path.Combine(Sendto_Path, File.Name))
Next
End Sub
#Region " Validate Windows FileName "
' [ Validate Windows FileName Function ]
'
' By Elektro H@cker
'
' Examples :
' MsgBox(Validate_Windows_FileName("C:\Test.txt")) ' Result: True
' MsgBox(Validate_Windows_FileName("C:\Te|st.txt")) ' Result: False
Private Function Validate_Windows_FileName(ByRef FileName As String)
Dim Directory As String = Nothing
Dim File As String = Nothing
Try
Directory = FileName.Substring(0, FileName.LastIndexOf("\")) & "\"
File = FileName.Split("\").Last
Catch
If Directory Is Nothing Then File = FileName
End Try
If Directory Is Nothing AndAlso File Is Nothing Then Return False
If Not Directory Is Nothing Then
For Each InvalidCharacter As Char In IO.Path.GetInvalidPathChars
If Directory.Contains(InvalidCharacter) Then
' MsgBox(InvalidCharacter)
Return False
End If
Next
End If
If Not File Is Nothing Then
For Each InvalidCharacter As Char In IO.Path.GetInvalidFileNameChars
If File.Contains(InvalidCharacter) Then
' MsgBox(InvalidCharacter)
Return False
End If
Next
End If
Return True ' FileName is valid
End Function
#End Region
End Class
...Часть вторая (я думаю, менее важная):
#Region " WinAmp Info "
' [ WinAmp Info Functions ]
'
' // By Elektro H@cker
'
' Examples:
' MsgBox(WinAmpInfo.Title) ' Result: Artist - Title
' MsgBox(WinAmpInfo.FileName) ' Result: C:\Title.ext
Public Class WinAmpInfo
Private Const WinampClassName As String = "Winamp v1.x"
Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Auto Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Integer) As Integer
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Byte, ByVal nSize As Long, ByRef lpNumberOfBytesRead As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Shared Function Title() As String
Dim hwnd As IntPtr = FindWindow(WinampClassName, vbNullString)
Dim lpText As String = String.Empty
Dim strTitle As String = String.Empty
Dim intLength As Integer = 0
Dim intName As Integer = 0
Dim intLeft As Integer = 0
Dim intRight As Integer = 0
Dim intDot As Integer = 0
If hwnd.Equals(IntPtr.Zero) Then Return "WinAmp is not running"
lpText = New String(Chr(0), 100)
intLength = GetWindowText(hwnd, lpText, lpText.Length)
If (intLength <= 0) _
OrElse (intLength > lpText.Length) _
Then Return "Unknown"
strTitle = lpText.Substring(0, intLength)
intName = strTitle.IndexOf(" - Winamp")
intLeft = strTitle.IndexOf("[")
intRight = strTitle.IndexOf("]")
If (intName >= 0) _
AndAlso (intLeft >= 0) _
AndAlso (intName < intLeft) _
AndAlso (intRight >= 0) _
AndAlso (intLeft + 1 < intRight) _
Then Return strTitle.Substring(intLeft + 1, intRight - intLeft - 1)
If (strTitle.EndsWith(" - Winamp")) _
AndAlso (strTitle.Length > " - Winamp".Length) _
Then strTitle = strTitle.Substring(0, strTitle.Length - " - Winamp".Length)
intDot = strTitle.IndexOf(".")
If (intDot > 0) _
AndAlso (IsNumeric(strTitle.Substring(0, intDot))) _
Then strTitle = strTitle.Remove(0, intDot + 1)
Return strTitle.Trim
End Function
Public Shared Function FileName() As String
Dim lp As Long, lpWinamp As Long, iIndex As Long, PID As Long, bRet As Long, dwRead As Long
Dim Buffer(260) As Byte
Dim hWndWinamp As IntPtr = FindWindow(WinampClassName, vbNullString)
If hWndWinamp = 0 Then Return Nothing
iIndex = SendMessage(hWndWinamp, &H400, 0, 125)
lp = SendMessage(hWndWinamp, &H400, iIndex, 211)
If lp = 0 Then Return Nothing
Call GetWindowThreadProcessId(hWndWinamp, PID)
lpWinamp = OpenProcess(&H10, 0, PID)
If lpWinamp = 0 Then Return Nothing
bRet = ReadProcessMemory(lpWinamp, lp, Buffer(0), 260, dwRead)
Call CloseHandle(lpWinamp)
Return System.Text.UnicodeEncoding.Default.GetString(Buffer)
End Function
End Class
#End Region
ОБНОВЛЕНИЕ 3:
Моя новая попытка... все объяснено, я получаю недопустимые символы, и я не знаю, почему...
Private Sub Button_Send_Click(sender As Object, e As EventArgs) Handles Button_Send.Click
For Each item As ListViewItem In ListView1.Items
Dim filenameee As String = item.SubItems(0).Text.Trim ' The trim is...fuck, is just 'cause I don't know what more try to get a valid path...)
Clipboard.SetText(filenameee) ' result: "C:\Test.mp3" (Without any double quote of course)
' ...but this launchs an "not exists" msgbox with the filename "C:\Test.mp3":
If IO.File.Exists(filenameee) Then MsgBox("exists") Else MsgBox("not exists")
MsgBox(filenameee) ' this showns "C:\Test.mp3" /without double quotes)
MsgBox("filename is vlaid?:" & Validate_Windows_FileName(filenameee)) ' Result: False (path is invalid) (REALLY!!!!??? WTF)
' Here, an exception: "Illegal characters in path" :
Dim File As New IO.FileInfo(item.SubItems(0).Text) ' (REALLY!!!!???)
Next
End Sub
ОБНОВЛЕНИЕ 4:
ФОТОГРАФИИ:
Само приложение:
(C:\Test.mp3 — это переменный текст имени файла)
Проверка Io.file.exists:
Отображение содержимого переменной filenameee:
проверка правильности имени файла:
Отображение предполагаемого недопустимого символа в имени файла:
(пространство?)
Исключение:
ОБНОВЛЕНИЕ 5
Я думаю, что настоящая проблема здесь, в функции "filename()" моего класса winamp, которую я опубликовал в ОБНОВЛЕНИИ № 2:
Return System.Text.UnicodeEncoding.Default.GetString(Buffer)
Потому что, как вы можете видеть на изображениях, он возвращает действительную строку, но в «Autos» появляется большая строка:
Поэтому, пожалуйста, если кто-то может помочь мне исправить это...
Спасибо.
ОБНОВЛЕНИЕ 6:
Это работает, я хочу знать, существует ли метод или что-то, чтобы улучшить это, чтобы избежать использования цикла For:
Dim i As Int32 = 0
For Each by In System.Text.Encoding.Default.GetString(Buffer)
If by = Nothing Then Exit For 'MsgBox(i)
i += 1
Next
Return System.Text.Encoding.Default.GetString(Buffer, 0, i)