Тупик с обработкой пути файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Тупик с обработкой пути файла

Сообщение |kerish| » 15.08.2005 (Пн) 11:52

Есть путь файла и мне нужно проверить его существование.
Я использую Dir или апишную PathFileExist и всё нормально.
Но загвоздка в том, что у меня в строковом массиве есть и пути к исполняющим файлам с командной строкой в конце, типа "D:\Prog.exe /setup" или даже вот такие "D:\Prog.exe C:\install.log".
Короче, я стал в тупик, так как не могу обработать строку, убрав лишнее и оставив только путь.
Помогите!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2005 (Пн) 11:57

Private Declare Sub PathRemoveArgs Lib "shlwapi.dll" Alias "PathRemoveArgsA" (ByVal pszPath As String)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 15.08.2005 (Пн) 11:59

|kerish|, плохой тон так писать командную строку: D:\Prog.exe C:\install.log
Ковычки надо ставить и проблемы решаться: "D:\Prog.exe" C:\install.log
Программисты не глючат - глючат компиляторы...

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 15.08.2005 (Пн) 14:05

GSerg, Но писать без ковычек всё равно плохо, у пользователя может легко быть файл "C:\1.exe a" - хоть и маловероятно, но файловая система это позволяет...
Программисты не глючат - глючат компиляторы...

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 15.08.2005 (Пн) 14:11

GSerg Большое спасибо, а то я задрался свои функции для обработки придумывать.
CodeName33 Это не я так пишу. Массив с путями мне дан извне.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 15.08.2005 (Пн) 18:46

По моему, нужно искать первый попавшийся пробел, начинаяя сначала, если строка не начинается с кавычек, в противном случае, искать, где есть вторая кавычка. Это и будет путь к исполнимому файлу. Т.е, иначе говоря, правой границей пути к файлу будет либо пробел, либо вторая кавычка.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 16.08.2005 (Вт) 10:23

Alexanbar Пробел может быть даже в названии папки (например "Program Files"). Поэтому эта идея отпадает.
GSerg А как использовать эту процедуру?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2005 (Вт) 10:26

s="D:\Prog.exe C:\install.log"
PathRemoveArgs s
s=left$(s,instr(1,s,vbnullchar)-1)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 16.08.2005 (Вт) 10:35

Двойное спасибо.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 16.08.2005 (Вт) 10:46

Блин, полный облом. Даже PathRemoveArgs, коряво работает с путями, где встречаются пробелы. Всё, что после пробела кажется ему аргументом.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 16.08.2005 (Вт) 12:13

|kerish| писал(а):Alexanbar Пробел может быть даже в названии папки (например "Program Files"). Поэтому эта идея отпадает.
GSerg А как использовать эту процедуру?


Такие папки заключаются в кавычки. Соответственно, вместо пробела ищется вторая кавычка.

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 16.08.2005 (Вт) 12:17

|kerish| попробуй вот это - не судите, на скорую руку сделал :roll:


Код: Выделить всё
Private Function InfazePAthDet(sString As String) As String
Dim i As Integer, n As Integer
Dim b$
Dim c$
n = 5
For i = 1 To Len(sString)
  b$ = Mid(sString, i, 1)
    If b$ = "." Then
        Do While n < Len(sString) - i
            b$ = Mid$(sString, i, n)
            If Right$(b$, 1) = " " Then InfazePAthDet = c$ & Trim$(b$): Exit Function
            n = n + 1
        Loop
    End If
  c$ = c$ & b$
Next i
End Function
No comments ...

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 16.08.2005 (Вт) 12:26

Брат, может я не в тему, но а почему бы не выполнить необходимое действие с файлом, а в случаее ошибки вывести мессагу, что его нет или что он недоступен.

типа
Код: Выделить всё
Sub SUB1()
On error Goto ERROR

'..действия со строкой (выполнение)

Exit Sub
ERROR:
msgbox err.description
End Sub


Или всё сложнее ? :wink:

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 16.08.2005 (Вт) 12:41

ALX_2002 Нужно всего лишь узнать, существует этот файл или нет. А команды Dir и PathFileExist с аргументами работать не могут.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.08.2005 (Вт) 13:35

|kerish| писал(а):ALX_2002 Нужно всего лишь узнать, существует этот файл или нет. А команды Dir и PathFileExist с аргументами работать не могут.


Если кавычек нет, то можно просто проверять на существование файлы с возможными именами, начиная с самого длинного...

В общем, попробуй - набросал на скорую руку:

Код: Выделить всё

    If FileAExists("C:\Temp\MPsetupXP.exe  i nstall", ss) Then
        Debug.Print "File Exists: " & ss
    Else
        Debug.Print "File Not Exists"
    End If

Public Function FileAExists(ByVal sPath As String, sFilePath As String) As Boolean
    Dim i As Integer
    sPath = Trim$(sPath): sFilePath = vbNullString
    If Left$(sPath, 1) = """" Then
        i = InStr(2, sPath, """")
        If i Then
            sPath = Mid$(sPath, 2, i - 1)
        Else
            sPath = Mid$(sPath, 2)
        End If
    Else
        i = InStr(sPath, """")
        If i Then sPath = Left$(sPath, i - 1)
    End If
    Do
        If FileExists(sPath) Then
            FileAExists = True
            sFilePath = sPath
            Exit Function
        End If
        i = InStrRev(sPath, " ")
        If i = 0 Then Exit Do
        sPath = RTrim$(Left$(sPath, i - 1))
    Loop
End Function

Public Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 17.08.2005 (Ср) 10:28

Всем спасибо.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 17.08.2005 (Ср) 10:58

А если такой вариант:
Код: Выделить всё
Public Function ExtractFileName(ByVal sFName As String) As String
'
On Error GoTo eRes

'//////////////////////////////////////////////////////////////////////////////////////
  Dim sTArray() As String, j As Long
  Dim sTString As String
'//////////////////////////////////////////////////////////////////////////////////////

sFName = Replace(Trim(sFName), Chr(34), "", , , vbTextCompare)
sTArray = Split(sFName, " ", , vbTextCompare)
sTString = ""
For j = 0 To UBound(sTArray)
  sTString = sTString & " " & sTArray(j)
  If Dir(Trim(sTString)) <> "" Then
    ExtractFileName = sTString
    Exit Function
  End If
Next
ExtractFileName = ""

Exit Function
eRes:
  MsgBox Err.Description
  Resume Next
End Function

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2005 (Ср) 11:15

Sedge писал(а):А если такой вариант:


Можно и так, только надо поправить - между словами может быть несколько пробелов...

А вообще по правилам путь содержащий пробелы обязательно должен быть заключен в кавычки. Если путь начинается без кавычек, то просто ищем первый пробел.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 17.08.2005 (Ср) 11:21

Код работает и с несколькими пробелами в пути.
Кавычки искать конечно можно... Но так все выглядит более изящно. ИМХО.
Да и на стандарты - дело темное.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2005 (Ср) 11:30

Sedge писал(а):Да и на стандарты надеятся не всегда можно.


Ну в первую очередь их надо соблюдать самому.
Иначе откуда возьмется такая строка?

IMHO вряд ли при создании того-же ярлыка вы сможете ввести аналогичную строку...

А поощрять юзера к неверному вводу разгребая за него конюшни тоже не есть хорошо - лучше уж просто разделить ему для ввода путь к файлу и командную строку...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 17.08.2005 (Ср) 11:35

Ну вот смотри - полторы минуты копания в реестре:
C:\Program Files\ATnotes\ATnotes.exe -lang -dcfile:lng.ru
Ни одной кавычки, хотя пробел в пути наличиствует.
Так что стандарты - это хорошо и правильно, но надеятся на то, что каждый будет их соблюдать - верный путь к глючному коду.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.08.2005 (Ср) 11:41

Sedge писал(а):Ну вот смотри - полторы минуты копания в реестре:
C:\Program Files\ATnotes\ATnotes.exe -lang -dcfile:lng.ru
Ни одной кавычки, хотя пробел в пути наличиствует.
Так что стандарты - это хорошо и правильно, но надеятся на то, что каждый будет их соблюдать - верный путь к глючному коду.


Ну в своей программе ты их-то соблюдать можешь и должен. Тогда таких проблем не будет.

Другое дело когда нужно обрабатывать пути чужих программ (случаи аналогичные приведенному выше). Тогда, конечно, придется крутиться - тут никуда не денешься...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 19.08.2005 (Пт) 4:32

Если аргумент командной строки - имя файла, то в командной строке будет больше, чем 1 символ ":", отмотав от второго назад до пробела, получается первый аргумент ком.строки, от третьего назад до пробела - второй и т.д. Так можно разгрести любое количество имен, передаваемых с ком.строкой.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 95

    TopList