Забавное поведение VBA

yolki

0. имеем пустой каталог C:\xxx
1. открываем его в проводнике, держим открытым окно
2. в VBA удаляем каталог при помощи RmDir
3. Проверяем наличие каталога при помощи Dir
=> каталог существует.
если между п.2 и п.3. поставить задержку, порядка 50мс, то результат такой: каталога нет (как будто удаляется с задержкой).
Если каталог не открывать в проводнике - результат: каталога не существует (удаляется мгновенно)
переписать вот это всё на С/C# - не воспроизводится.
это нормально вообще?
Я в курсе про FSO.
пример кода выложу, как на работу приду. дома офиса нет.
эта хрень мне покоя не даёт

tucha96

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

yolki

я же говорил © !
с самого начала говорил, что надо писать через VSTO на сишарпе.
нет, бля - мы на VBA умеем.
ну этот, с позволения сказать, макрос плодит документы по шаблону. в заданном каталоге (с подкаталогами). перед началом работы чистит свои выходные каталоги.

Dasar

Вообще, это означает, что где-то появляется: то ли просто открытый дескриптор на каталог, то ли дескриптор с незавершенной операцией.
Гипотеза: VBA удаляет сложным образом, а это шандарашит notify-аи на изменение директории от ОС к эксплореру, на что эксплорер запускает перечитывание инфы о каталоге, что и занимает какое-то время.

yolki


Sub DelFolderTest
Dim mydir
fd = "C:\xx"
Set fs = CreateObject("Scripting.FileSystemObject")

If fs.FolderExists(fd) Then
RmDir fd
' Debug.Print "RmDir finished" ' ***
mydir = Dir(fd, vbDirectory) ' ##
Debug.Print "Empty string if deleted successfully: [" + mydir + "]" '##

If fs.FolderExists(fd) Then
Debug.Print ("Still there")
Else
Debug.Print "Deleted"
End If
Else
Debug.Print ("No folder")
End If

End Sub


как-то так.
т.е. если папку держим открытой в проводнике - то вывод такой:

Empty string if deleted successfully: [xx]
Deleted

Если не держим открытой - то вывод такой:

Empty string if deleted successfully: []
Deleted

если раскомментить *** и держать папку открытой в проводнике, то вывод такой:

RmDir finished
Empty string if deleted successfully: []
Deleted

Аналогичный результат, если между RmDir и Dir (там где ***) вставить задержку
Удалять через fso надёжнее и правильнее.
Но, к сожалению, гениальный конструктор уже всё написал без него. на рефакторинг ресурсов нет.

6yrop

как будто удаляется с задержкой
на C# тоже такое иногда воспроизводится, на stackoverflow есть обсуждение этого, типа это ОС себя так ведет

Maurog

Гипотеза: VBA удаляет сложным образом
Гипотеза: проблема не в VBA, а в эксплорере :grin:
Оставить комментарий
Имя или ник:
Комментарий: