Существует ли файл?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Существует ли файл?

Сообщение arthur2 » 05.03.2010 (Пт) 0:17

Dir не катит, поскольку путь может быть уникодным :D

Собственно, пользуюсь FindFirstFileW, но подозреваю, что есть способ проще... Или нету?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 05.03.2010 (Пт) 6:22

Вопрос решен :)
Способ 3 (GetFileAttributes)
Артур
 
   

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

Re: Существует ли файл?

Сообщение Andrey Fedorov » 05.03.2010 (Пт) 9:06

arthur2 писал(а):Dir не катит, поскольку путь может быть уникодным :D


С чего это функции VB перестали уметь работать с такими файлами?
Dir для данной цели лучше не использовать, но совсем по другой причине.

arthur2 писал(а):Собственно, пользуюсь FindFirstFileW, но подозреваю, что есть способ проще... Или нету?


Если чисто на VB:

Код: Выделить всё
Public Function IsFile(sFile As String) As Boolean
    On Error Resume Next
    IsFile = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function


Ну или FileExists метод объекта FileSystemObject.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 05.03.2010 (Пт) 11:35

Andrey Fedorov писал(а):С чего это функции VB перестали уметь работать с такими файлами?

Прежде чем возразить, надо, наверное, попробовать? Даже проект не запустится из папки, если в пути есть уникодные символы. Бейсик напрочь не умеет работать с уникодными путями. Стандартными средствами можно открыть файл, содержащий в пути уникод, но нужно сначала преобразовать путь GetShortPathNameW. Ну а Dir на уникодном пути просто вываливается :lol: Как и GetAttr. Собственно, последней можно скормить преобразованный путь и она сможет не подавиться... но зачем, если GetFileAttributes даёт тот же результат без необходимости преобразовывать путь. Говорю же, вопрос решен :D

Да, для эксперементов не подходять пути, набранные по-русски, на русской машине они преобразуются к ANSI. Попробуй проверить на папках и файлах, в названии которых намешаны несколько языков. Что-нибудь вроде "уникод\עברית\Ελληνικά.txt"
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Существует ли файл?

Сообщение iGrok » 05.03.2010 (Пт) 14:47

Я вот думаю, а почему реально никто не пользуется вот этим:
http://msdn.microsoft.com/en-us/library/bb773559.aspx

Там есть, к примеру http://msdn.microsoft.com/en-us/library/bb773584.aspx
И её уникодная версия.
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 05.03.2010 (Пт) 15:00

iGrok писал(а):Я вот думаю, а почему реально никто не пользуется вот этим:
Это я тоже нашел :) (по моей ссылке этот способ тоже есть - под номером 7)
Не пользуюсь, потому что http://forum.sources.ru/index.php?showt ... &p=2524424 и ниже по топику :)
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Существует ли файл?

Сообщение iGrok » 05.03.2010 (Пт) 19:55

arthur2 писал(а):
iGrok писал(а):Я вот думаю, а почему реально никто не пользуется вот этим:
Это я тоже нашел :) (по моей ссылке этот способ тоже есть - под номером 7)
Не пользуюсь, потому что http://forum.sources.ru/index.php?showt ... &p=2524424 и ниже по топику :)

На самом деле, не особо убедительно. =)
UNC он поддерживает (в том случае, если это именно UNC ссылка на файл, а не на шару/сервер/принтер и т.п.) - http://msdn.microsoft.com/en-us/library/bb773584.aspx
Ну а актуальность nt4.0 и win95 это как-то.. Ну не знаю. )
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 05.03.2010 (Пт) 20:12

Главный аргумент: зачем использовать то, если можно использовать это :) К тому же, в системе может просто не быть IE (хитрый юзер руками выдрал, а то и штатрыми средствами - в молодых виндах вроде как, это возможно, ЕМНИП)
Артур
 
   

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Существует ли файл?

Сообщение iGrok » 05.03.2010 (Пт) 22:14

arthur2 писал(а):Главный аргумент: зачем использовать то, если можно использовать это :) К тому же, в системе может просто не быть IE (хитрый юзер руками выдрал, а то и штатрыми средствами - в молодых виндах вроде как, это возможно, ЕМНИП)

Главный аргумент я, конечно, принимаю.

А вот второй - нет. Почему? Всё очень просто. =)
В системе может не быть IE, но в системе не может не быть shlwapi.dll =)
Только если какой-то придурок её именно что "руками удалил". Но тогда у него много чего не будет работать.

А IE4 там упомянуто только к тому, что эта ф-ция есть только в версиях библы, начиная с 4.71. В win95/NT4 версия этой библы младше, а эта версия ставится вместе с IE4.
label:
cli
jmp label

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 06.03.2010 (Сб) 0:31

На Сорцах добавили аргумент против моего способа :oops:

Так что может всё-таки остановлюсь на PathFileExists :D
Артур
 
   

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

Re: Существует ли файл?

Сообщение Andrey Fedorov » 06.03.2010 (Сб) 17:48

arthur2 писал(а):
Andrey Fedorov писал(а):С чего это функции VB перестали уметь работать с такими файлами?

Прежде чем возразить, надо, наверное, попробовать? Даже проект не запустится из папки, если в пути есть уникодные символы. Бейсик напрочь не умеет работать с уникодными путями.


Дело не в бэйсике, а в кривых ручках.
Можете сами попробовать:

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

Public Sub Main()
    Dim m() As Byte
    Dim fs As New FileSystemObject, t As TextStream, s As String, ss As String
   
    s = "Проба "
    m = s
    ReDim Preserve m(17)
    m(12) = &H1D
    m(13) = &H6D
    m(14) = &H1F
    m(15) = &H9D
    m(16) = &H1F
    m(17) = &HCC
    s = m
   
    ss = App.Path & "\" & s
   
    On Error Goto Err_
    If Not fs.FolderExists(ss) Then fs.CreateFolder (ss)
    ss = ss & "\" & s & ".txt"
    If Not fs.FileExists(ss) Then
        Set t = fs.CreateTextFile(ss, , True)
    Else
        Set t = fs.OpenTextFile(ss, ForAppending, False, TristateTrue)
    End If
    t.WriteLine Now & " - " & s
    t.Close

Err_:
    MsgBox "Бэйсик " & IIf(fs.FileExists(ss), vbNullString, "не ") & "умеет работать у уенкодом"
End Sub


Поняли в чем ваша ошибка?
-----------------------------------------
По меньшей мере такую ерунду как проверить существование файла или записать в него можно без проблем.

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

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Существует ли файл?

Сообщение arthur2 » 06.03.2010 (Сб) 20:45

При чем здесь кривые руки и фсо? Речь изначально шла о том, что бейсик не умеет работать с уникодными путями. Кстати, с уникодом в отрыве от путей бейсик работает отлично (судя по странным манипуляциям с байтовым массивом, ты в это не очень вникал - логичнее было бы сделать так: s="Проба " & chrw(&H6D1D) & chrw(&H9D1F)& chrw(&HCC1F) - с тем же результатом )

Итак бейсик сам, без фсо, работать с уникодными путями не умеет. Встроенные функции - Dir, GetAtr и пр. уникодных путей не понимают. Open не откроет файл, если указать уникодный путь. App.Path вернёт вопросики. Даже файл проекта не запустится из уникодной папки - бейсик просто не найдёт файла.
Andrey Fedorov писал(а):Если чисто на VB:
Код: Выделить всё
Public Function IsFile(sFile As String) As Boolean
    On Error Resume Next
    IsFile = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function

Вот это - НЕ ЗАРАБОТАЕТ, если передать уникодный путь. "Можете сами попробовать" :D

А фсо - да, умеет работать с уникодом. Но я прекрасно обхожусь и без фсо, на АПИ и W-версиях функций. Так что мои программы на бейсике - с уникодными путями работать умеют. И без фсо.

А ещё - скомпилируй свой FSO-пример, положи экзешник внутрь уникодной папки и запусти. Он подавится на строке App.Path :D
Артур
 
   

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

Re: Существует ли файл?

Сообщение Andrey Fedorov » 09.03.2010 (Вт) 9:29

arthur2 писал(а):А ещё - скомпилируй свой FSO-пример, положи экзешник внутрь уникодной папки и запусти. Он подавится на строке App.Path :D


Да влом уже, честно говоря. Для меня сейчас любой намек на том что при написании программы будет подобный геморой это повод к отказу от VB6 и написанию программы на VB.NET. Ну нафига самому продолжать изобретать лисапеды и костыли, когда все уже давно сделано до нас? И сделано весьма неплохо. Потому уже не вижу повода скрипя зубами и обертываясь в WinApi продолжать упорно держаться за все устаревающее средство разработки...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


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

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

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

    TopList