Всем добрый день. Помогите пожалуйста понять логику работы кода PathExists ниже
Если pname - это не существующий путь к папке (например: c:\windows100500\) , то GetAttr (pname) должен вернуть ошибку File not found далее срабатывает инструкция On Error Resume Next и код идет на строку номер 10, где какое-то странное равенство:
(GetAttr(pname) And vbDirectory) = vbDirectory
в чем логика этого равенства?
[vba]
Код
Function PathExists(pname) As Boolean ' Возвращает TRUE, если путь существует On Error Resume Next 10 PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory Debug.Print GetAttr(pname), (GetAttr(pname) And vbDirectory) End Function
[/vba]
Всем добрый день. Помогите пожалуйста понять логику работы кода PathExists ниже
Если pname - это не существующий путь к папке (например: c:\windows100500\) , то GetAttr (pname) должен вернуть ошибку File not found далее срабатывает инструкция On Error Resume Next и код идет на строку номер 10, где какое-то странное равенство:
(GetAttr(pname) And vbDirectory) = vbDirectory
в чем логика этого равенства?
[vba]
Код
Function PathExists(pname) As Boolean ' Возвращает TRUE, если путь существует On Error Resume Next 10 PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory Debug.Print GetAttr(pname), (GetAttr(pname) And vbDirectory) End Function
Здравствуйте. Думаю, что сработает и вариант [vba]
Код
PathExists = GetAttr(pname) = vbDirectory
[/vba] Если путь к папке существует, то GetAttr(pname) вернёт 16 (vbDirectory). Соответственно, вышеуказанная строка вернёт True, во всех остальных случаях - False
Здравствуйте. Думаю, что сработает и вариант [vba]
Код
PathExists = GetAttr(pname) = vbDirectory
[/vba] Если путь к папке существует, то GetAttr(pname) вернёт 16 (vbDirectory). Соответственно, вышеуказанная строка вернёт True, во всех остальных случаях - FalsePelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
А, значит, там прибавляются ещё атрибуты, типа архивный или скрытый. Тогда читаем справку
Цитата
Чтобы определить, какие атрибуты заданы, используйте оператор and для выполнения поразрядного сравнения значения, возвращаемого функцией GetAttr , и значения атрибута каждого файла, который требуется. Если результат не является нулем, то атрибут для заданного файла установлен. Например, возвращаемое значение следующего выражения And является нулем, если не установлен атрибут "Архив": Result = GetAttr(FName) And vbArchive Если атрибут "Архив" установлен, возвращается ненулевое значение.
А, значит, там прибавляются ещё атрибуты, типа архивный или скрытый. Тогда читаем справку
Цитата
Чтобы определить, какие атрибуты заданы, используйте оператор and для выполнения поразрядного сравнения значения, возвращаемого функцией GetAttr , и значения атрибута каждого файла, который требуется. Если результат не является нулем, то атрибут для заданного файла установлен. Например, возвращаемое значение следующего выражения And является нулем, если не установлен атрибут "Архив": Result = GetAttr(FName) And vbArchive Если атрибут "Архив" установлен, возвращается ненулевое значение.
[/vba] приводит к появлению странных ошибок - надстройка работала на 2010, но отказывалась работать на 2016. После вычистки Resume Next - заработала. Плюс я противник загадочных функций :-)
[vba]
Код
Public Function Каталог_Есть_FSO(ByVal msg As String) _ As Boolean
With CreateObject("Scripting.FileSystemObject")
If .FolderExists(msg) Then
Каталог_Есть_FSO = True
End If End With End Function
[/vba]
Привет! Использование [vba]
Код
On Error Resume Next
[/vba] приводит к появлению странных ошибок - надстройка работала на 2010, но отказывалась работать на 2016. После вычистки Resume Next - заработала. Плюс я противник загадочных функций :-)
[vba]
Код
Public Function Каталог_Есть_FSO(ByVal msg As String) _ As Boolean
Но есть ли уверенность что при ответе False FolderExists - каталога нет, а не его нельзя прочесть из-за отсутствия доступа, в виду ограничения прав, слишком длинного пути. … В таком случае без обработки ошибки не обойтись.
Но есть ли уверенность что при ответе False FolderExists - каталога нет, а не его нельзя прочесть из-за отсутствия доступа, в виду ограничения прав, слишком длинного пути. … В таком случае без обработки ошибки не обойтись.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Легко. Если не охота погрязнуть обработке ошибок - планируйте программу. Надеюсь Вам знаком стиль программирования, которого я придерживаюсь: обработка ошибок, в основном, в юнит-тестах. Мудрые научили, что функция-артефакт не должна заниматься обработкой ошибок. Можете поручить это декоратору.
Легко. Если не охота погрязнуть обработке ошибок - планируйте программу. Надеюсь Вам знаком стиль программирования, которого я придерживаюсь: обработка ошибок, в основном, в юнит-тестах. Мудрые научили, что функция-артефакт не должна заниматься обработкой ошибок. Можете поручить это декоратору.InExSu
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
[offtop] InExSu, Михаил, напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа, без обработки ошибок и я сотру пост 11. Не надо путать бездумное использование On Error Resume Next и обработку ошибок вызванных, как специально, так и внешними факторами. Давайте приземлённее. Нужно проверить, наличие листа с заданными именем. Есть вариант перебрать все и сравнивать имя, а можно просто обратится к листу по заданному и проверить наличие ошибки.[/offtop]
[offtop] InExSu, Михаил, напишите код обхода каталога с рекурсивным вложением с учетом полного пути более 260 символов и с различным уровнем доступа, без обработки ошибок и я сотру пост 11. Не надо путать бездумное использование On Error Resume Next и обработку ошибок вызванных, как специально, так и внешними факторами. Давайте приземлённее. Нужно проверить, наличие листа с заданными именем. Есть вариант перебрать все и сравнивать имя, а можно просто обратится к листу по заданному и проверить наличие ошибки.[/offtop]bmv98rus
Замечательный Временно просто медведь , процентов на 20.
обратится к листу по заданному и проверить наличие ошибки.
именно такой код [vba]
Код
On Error Resume Next Wb_Act.Worksheets(msg).Delete On Error GoTo 0
[/vba]в надстройке и вызывал ошибку Appliction-defined or object-defined error в 2016 офисе (Break on Unhandled Errors не помог), без указания строки ошибки, хотя работал в 2010. И пришлось использовать
обратится к листу по заданному и проверить наличие ошибки.
именно такой код [vba]
Код
On Error Resume Next Wb_Act.Worksheets(msg).Delete On Error GoTo 0
[/vba]в надстройке и вызывал ошибку Appliction-defined or object-defined error в 2016 офисе (Break on Unhandled Errors не помог), без указания строки ошибки, хотя работал в 2010. И пришлось использовать
InExSu, Я еще раз намекаю, что путь длиннее 260 символов и доступ может быть закрыт на уровне файловой системы. Рекурсивно обойти не проблема, обойти все возможное - сложнее.
InExSu, Я еще раз намекаю, что путь длиннее 260 символов и доступ может быть закрыт на уровне файловой системы. Рекурсивно обойти не проблема, обойти все возможное - сложнее.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
то есть этот метод позволит добраться до самой последней паки C:\temp\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_.zip\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\
Структура в архиве. Пример конечно синтезированный, но реальные аналоги встречаю очень часто.
то есть этот метод позволит добраться до самой последней паки C:\temp\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_.zip\123456789_123456789_123456789_123456789__123456789__123456789__123456789__123456789__123456789__123456789_\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\0123456789\
Структура в архиве. Пример конечно синтезированный, но реальные аналоги встречаю очень часто.bmv98rus