| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Удаление каталога

DwgRuLispLib: Удаление каталога

Ответ
Поиск в этой теме
Непрочитано 14.01.2008, 10:55 #1
DwgRuLispLib: Удаление каталога
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,787

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-browse-dir-delete
;;; *
;;; * 07/12/2007 Версия 01.001.14.
;;; * Кулик Алексей aka kpblc
;;; ************************************************************************

(defun dwgru-browse-dir-delete (path / svr res)
;;;    Удаляет существующий каталог со всеми его подкаталогами и файлами.
;;;    Возвраемое значение: нет
;;;   Допускается наличие в каталоге файлов read-only и hidden. Они все равно
;;; будут удаляться.
;;;    Примеры вызова:
  ;|
(dwgru-browse-dir-delete "c:\\1")
(dwgru-browse-dir-delete "c:\\1\\")
|;
  (setq svr (vlax-get-or-create-object "Scripting.FileSystemobject")
        res (vl-catch-all-apply
              '(lambda ()
                 (vlax-invoke-method
                   svr
                   'deletefolder
                   (_dwgru-dir-path-no-splash path)
                   :vlax-true
                   ) ;_ end of vlax-invoke-method
                 ) ;_ end of lambda
              ) ;_ end of vl-catch-all-apply
        ) ;_ end of setq
  (vlax-release-object svr)
  (princ)
  ) ;_ end of defun

Вложения
Тип файла: lsp dwgru-browse-dir-delete.LSP (1.2 Кб, 257 просмотров)

__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 21678
 
Непрочитано 14.01.2008, 11:43
#2
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


А почему
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
...
        ) ;_ end of setq
  (vlax-release-object svr)
  (princ)
  ) ;_ end of defun
а не:
Код:
[Выделить все]
...
        ) ;_ end of setq
  (vlax-release-object svr)
  res
  ) ;_ end of defun
Alaspher вне форума  
 
Автор темы   Непрочитано 14.01.2008, 11:49
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Если честно, res был введен в тестировочных целях. Он вернет <%catch-all-apply-error%> только в одном случае - если каталог удалить не удалось (каталог, например, открыт в окне проводника или FAR'a). Он нужен только если вводить дополнительный анализ - получилось удаление или нет.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 14.01.2008 в 12:08.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2008, 11:56
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Надо обязательно вставить запрос на подтверждения действия. Иначе, данную функцию, после компилирования можно использовать во вредоносных целях. Например - грохнуть C:\WINDOWS
Supermax вне форума  
 
Непрочитано 14.01.2008, 12:04
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Также не понятно что произойдет, а точнее что должно произойти, если один из файлов в папке занят приложением.
Я считаю, что надо проверять освобожденность всех вложенных объектов.
Supermax вне форума  
 
Непрочитано 14.01.2008, 12:54
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если честно, res был введен в тестировочных целях. Он вернет <%catch-all-apply-error%> только в одном случае - если каталог удалить не удалось (каталог, например, открыт в окне проводника или FAR'a). Он нужен только если вводить дополнительный анализ - получилось удаление или нет.
Так оно и правильно - иначе, как узнать об успехе/неудаче операции?
Сейчас получилось, что дал команду, а о выполнении и слышать не хочу.
Alaspher вне форума  
 
Автор темы   Непрочитано 14.01.2008, 13:16
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Ок, переделаю. Или ты сделаешь?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2008, 13:36
#8
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ок, переделаю. Или ты сделаешь?
прынц на рес махнуть? Лан, так сделаем пока:

Код:
[Выделить все]
;;; ************************************************************************
;;; * Библиотека DWGruLispLib Copyright ©2007  DWGru Programmers Group
;;; *
;;; * dwgru-browse-dir-delete
;;; *
;;; * 07/12/2007 Версия 01.001.14.
;;; * Кулик Алексей aka kpblc
;;; ************************************************************************
 
(defun dwgru-browse-dir-delete (path / svr res)
;;;    Удаляет существующий каталог со всеми его подкаталогами и файлами.
;;;    Возвраемое значение: nil, при успешном удалении или
;;;    VL-CATCH-ALL-APPLY-ERROR, при возникновении ошибки.
;;;   Допускается наличие в каталоге файлов read-only и hidden. Они все равно
;;; будут удаляться.
;;;    Примеры вызова:
  ;|
(dwgru-browse-dir-delete "c:\\1")
(dwgru-browse-dir-delete "c:\\1\\")
|;
  (setq svr (vlax-get-or-create-object "Scripting.FileSystemobject")
        res (vl-catch-all-apply
              '(lambda ()
                 (vlax-invoke-method
                   svr
                   'deletefolder
                   (_dwgru-dir-path-no-splash path)
                   :vlax-true
                   ) ;_ end of vlax-invoke-method
                 ) ;_ end of lambda
              ) ;_ end of vl-catch-all-apply
        ) ;_ end of setq
  (vlax-release-object svr)
  res
  ) ;_ end of defun

Последний раз редактировалось Alaspher, 14.01.2008 в 21:25.
Alaspher вне форума  
 
Автор темы   Непрочитано 14.01.2008, 13:38
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Не только princ -> res. Описалово тоже надо было подправить. Я б точно забыл
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2008, 13:51
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Нельзя в библиотеку включать никакие функции, использующие FSO!

Нормальные админы запрещают использование этих объектов. Причина - в веб-страницу можно встоить объект FSO (и др. из WSH) и заставить пользователя выполнить то же самое удаление папки, или запустить программу.

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

Здесь же получится, что функция в библиотеке есть, а выполнить её нельзя. И что толку, если она будет защищена ловушкой?
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.01.2008, 13:58
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


По-моему, запрещают использовать скриптовые вещи (типа VBScript, JavaScript). Кстати, как запретить использование FileSystemObject так, чтобы и каталог можно было создавать тем же FAR'ом или Проводником, и программно это было нереализуемо (то есть нельзя было бы создать объект FSO), не подскажете? Я-то в этом ни в зуб ногой, а любопытно (дома на виртуалках проверну - специально домен из них сделаю если понадобится).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2008, 14:03
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Э, э, э! Вы че, мужики?! Где запрос на подтверждение? Это вам не хухры-мухры папку со всеми вложениями сносить! Хотябы ключик вставьте подтверждать или нет. Я че-то слабо себе представляю такую ситуацию, когда без подтверждения надо сносить. Только с целью крайне эффективного вредительства, разве что.

Сколько раз, мне в частности, винда не давала удалять файл, говорила что он занят, хотя на самом деле давно эту занятость сняли! Да и вам тоже наверняка. Смотрю на функцию и вижу, удаляет, удаляет, удаляет, а потом тык - удалить нельзя - занято. Что вернет все на старое место? Да как бы кад не слетел, и то хорошо будет.
Supermax вне форума  
 
Непрочитано 14.01.2008, 14:15
#13
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Хи-Хи, создал папку в С:\123 в ней текстовый файл и папку тоже с текстовым файлом.

Код:
[Выделить все]
(DWGRU-BROWSE-DIR-DELETE "C:\\123")
#<%catch-all-apply-error%>
и так:

Код:
[Выделить все]
(DWGRU-BROWSE-DIR-DELETE "C:\\123\\")
#<%catch-all-apply-error%>
Сначала один из файлов блокнотом держал открытым, а затем и держать не стал - все равно не удаляет.
Supermax вне форума  
 
Непрочитано 14.01.2008, 14:29
#14
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Нельзя в библиотеку включать никакие функции, использующие FSO!

Нормальные админы запрещают использование этих объектов. Причина - в веб-страницу можно встоить объект FSO (и др. из WSH)...
А как зарезать FSO не прикончив WSH?

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По-моему, запрещают использовать скриптовые вещи (типа VBScript, JavaScript). Кстати, как запретить использование FileSystemObject так, чтобы и каталог можно было создавать тем же FAR'ом или Проводником, и программно это было нереализуемо (то есть нельзя было бы создать объект FSO), не подскажете? Я-то в этом ни в зуб ногой, а любопытно (дома на виртуалках проверну - специально домен из них сделаю если понадобится).
FSO часть ActiveX, наверно както можно запретить целенаправленно его, но серьёзной причины делать это - не вижу. Скрипты на шлюзе режутся конечно, но это совсем другое.
Alaspher вне форума  
 
Непрочитано 14.01.2008, 17:55
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Предлагаю закончить ф-цию следующим образом
Код:
[Выделить все]
 
...
(vlax-release-object svr)
(not(VL-CATCH-ALL-ERROR-P res))
) ;_ end of defun
Тогда возвратом будет T - успех NIL-нет
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.01.2008, 18:58
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Что случилось - не пойму, но заработало.
Если в дереве удаляемых папок блокнотом открыт текстовый файл, то сносится все и блокнот исчезает, а если экселевский файл открыть, то сносится все вокруг него и остается цепочка папок к этому файлу и он сам.
Supermax вне форума  
 
Непрочитано 14.01.2008, 20:15
#17
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от Alaspher Посмотреть сообщение
А как зарезать FSO не прикончив WSH?
FSO часть ActiveX, наверно както можно запретить целенаправленно его, но серьёзной причины делать это - не вижу. Скрипты на шлюзе режутся конечно, но это совсем другое.
Это все часть Windows Script Host. А с безопасностью здесь всегда серьезные проблемы были. Microsoft их исправляет, и уверяет, что теперь все нормально. Как и во всем у MS (всё хорошо, прекрасная маркиза) - пока не находят новую дыру.

Неважно, видим ли я или ты серьезные причины - важно, видят ли их администраторы. Им проще всего запретить. Есть разные методы борьбы с WSH - от физического удаления WScript.exe и CScript.exe до запрета их запуска через разрешения NTFS. Автор книги "Средства автоматизации в Microsoft Windows. Справочник администратора" возмущен этим, так как "это означает, что большинство скриптов этой книги не будут выполняться". Добрый дядя. Целую главу написал по безопасной работе "безопасных" скриптов.

Правильным решением считается разрешение на выполнение "доверяемых скриптов". А чтобы скрипт стал "доверяемым" необходимо Цифровое подписание скрипта

Далее цитирую:

"Подписание скрипта не представляет сложностей. Сначала вы должны получить сертификат на подписание кода. Обычно его можно получить от коммерческого ЦС примерно за $300 в год (цены варьируются среди различных ЦС) или от внутреннего ЦС, если он есть в вашей организации. Помните, что ЦС, выдавший вам сертификат, должен быть доверяемым ЦС на всех компьютерах, где предположительно будет выполняться ваш скрипт. Получив сертификат, вы должны установить его. В процессе установки он копируется в специальное защищенное хранилище сертификатов на вашем компьютере."

Вот ежели мы хотим использовать в своих функциях (скриптах) WSH, то мы и должны это делать, иначе любой админ будет прав, закрыв WSH. Оно нам надо?

Тем более, что всё, что делают объекты FSO, можно лучше, надежней и безопасней сделать собственными компонентами библиотеки. Надо делать COM-сервер, в который собирать все "файловые" действия, причем реализовывать их не самоделками, а функциями WinAPI. При этом никакой "интерактивности" (запросов на удаление) в функциях и не должно быть - это решается на уровне программ, а не функций.

Вот невозможность удаления файлов - типичный пример. Это происходит из-за того, что одни программы держат файл постоянно открытым, а другие считывают его, закрывают и не держат захваченным. А некоторые еще и папку захватывают, даже после закрытия файла.
ShaggyDoc вне форума  
 
Непрочитано 14.01.2008, 21:52
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


> ShaggyDoc
Честно говоря, подписанных скриптов пока не видел. Конечно, хочется всё обезопасить, но отключение WSH усложняет некоторые процедуры, которые так удобно делать скриптами. Что бы действительно обезопасится, надо поотключать все API, какие есть в системе.

Насчёт того, включать ли такие функции... мне кажется можно включать, а вот когда сделаем свою dll, тогда и переделывать на её использование.

> VVA
Согласен - в описании ошибки всё равно ничего содержательного не будет - t/nil - лучше.
Alaspher вне форума  
 
Непрочитано 15.01.2008, 06:45
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


WSH очень удобен, особенно для администрирования. Да и для LISP тоже. Но "хотели как лучше...". Удобное средство оказалось очень опасным. И не только извне, с веб-страниц. Даже на LISP можно написать червя или трояна (полстраницы) и встроить в тело безобидной функции. Спам рассылать, или пароли спереть.

Что касается возврата результата в опубликованной функции, то там надо dwgru-error-catch применить, она и вернет требуемый T/NIL, и сообщит в командную строку о причине ошибки. Совсем молча тоже плохо - причины будут неизвестны. Сообщение может быть факультативным в зависимости от состояния какой-нибудь глобальной, наподобие *dwgru_debug*
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > DwgRuLispLib: Удаление каталога

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DwgRuLispLib: Функции чтения и установки свойств рисунка (_dwgprops) VVA Библиотека функций 15 14.12.2013 10:04
DwgRuLispLib: Генератор случайных чисел VVA Библиотека функций 16 11.03.2013 21:21
Есть ненужные документы. Посмотрите, кому что нужно Дмитрий832 Поиск литературы, чертежей, моделей и прочих материалов 73 18.12.2010 22:55
Удаление дыма через оконные проёмы Perezz!! Прочее. Архитектура и строительство 5 01.11.2006 16:38
быстродействие автокада MR.ZHEKA AutoCAD 19 01.02.2006 14:48