Забавное поведение VBA
была такая же проблема. решилась использованием VBA по назначению - нахуй удалять каталоги?!
с самого начала говорил, что надо писать через VSTO на сишарпе.
нет, бля - мы на VBA умеем.
ну этот, с позволения сказать, макрос плодит документы по шаблону. в заданном каталоге (с подкаталогами). перед началом работы чистит свои выходные каталоги.
Гипотеза: VBA удаляет сложным образом, а это шандарашит notify-аи на изменение директории от ОС к эксплореру, на что эксплорер запускает перечитывание инфы о каталоге, что и занимает какое-то время.
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 надёжнее и правильнее.
Но, к сожалению, гениальный конструктор уже всё написал без него. на рефакторинг ресурсов нет.
как будто удаляется с задержкойна C# тоже такое иногда воспроизводится, на stackoverflow есть обсуждение этого, типа это ОС себя так ведет
Гипотеза: VBA удаляет сложным образомГипотеза: проблема не в VBA, а в эксплорере
Оставить комментарий
yolki
0. имеем пустой каталог C:\xxx1. открываем его в проводнике, держим открытым окно
2. в VBA удаляем каталог при помощи RmDir
3. Проверяем наличие каталога при помощи Dir
=> каталог существует.
если между п.2 и п.3. поставить задержку, порядка 50мс, то результат такой: каталога нет (как будто удаляется с задержкой).
Если каталог не открывать в проводнике - результат: каталога не существует (удаляется мгновенно)
переписать вот это всё на С/C# - не воспроизводится.
это нормально вообще?
Я в курсе про FSO.
пример кода выложу, как на работу приду. дома офиса нет.
эта хрень мне покоя не даёт