Определить тип привода

Понадобилось мне тут нарисовать лиспик, который позволяет абсолютно однозначно определить, к какому диску сейчас выполняется обращение - к локальному, сетевому или съемному. Помню, что как-то на VBA в свое время я подобное решал. Но как - подробности давным-давно похоронены.

Ни "чистом" AutoLISP, ни в "нечистом" VisualLISP подобное я не обнаружил (справедливости ради надо заметить, что не особо и искал). Решил все сделать через длинный-длинный путь - обратиться к FileSystemObject:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
(defun _lispru-ws-get-drive-type (drive / svr res)
                                ;|
*    Получение типа привода.
*    Параметры вызова:
  drive  - имя привода, для которого надо получить тип
*    Возвращает:
  -1    ошибка (привод не существует или к нему нет доступа)
  1     съемный диск (дисковод или Flash-накопитель)
  2     локальный (жесткий) диск
  3     подключенный сетевой диск указан адрес типа "\\\\server\\drive$"
  4     CD / DVD-ROM
|;

  (setq svr (vlax-get-or-create-object "Scripting.FileSystemObject"))
  (if (vl-catch-all-error-p
        (vl-catch-all-apply
          (function
            (lambda ()
              (setq res (vlax-get-property (vlax-invoke-method svr 'getdrive drive) 'drivetype))
              ) ;_ end of lambda
            ) ;_ end of function
          ) ;_ end of vl-catch-all-apply
        ) ;_ end of vl-catch-all-error-p
    (setq res -1)
    ) ;_ end of if
  (vlax-release-object svr)
  (setq svr nil)
  res
  ) ;_ end of defun

Ничего особо сложного нет :)

P.S. В качестве памятки, свойства и методы, поддерживаемые FileSystemObject:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(vlax-dump-Object svr t)
; IFileSystem3: FileSystemObject
; Property values:
;   Drives (RO) = #<VLA-OBJECT IDriveCollection 00ee7160>
; Methods supported:
;   BuildPath (2)
;   CopyFile (3)
;   CopyFolder (3)
;   CreateFolder (1)
;   CreateTextFile (3)
;   DeleteFile (2)
;   DeleteFolder (2)
;   DriveExists (1)
;   FileExists (1)
;   FolderExists (1)
;   GetAbsolutePathName (1)
;   GetBaseName (1)
;   GetDrive (1)
;   GetDriveName (1)
;   GetExtensionName (1)
;   GetFile (1)
;   GetFileName (1)
;   GetFileVersion (1)
;   GetFolder (1)
;   GetParentFolderName (1)
;   GetSpecialFolder (1)
;   GetStandardStream (2)
;   GetTempName ()
;   MoveFile (2)
;   MoveFolder (2)
;   OpenTextFile (4)

Подробности можно найти в MSDN (правда, скорее всего, на английском языке).

P.P.S. Постепенно зреет ощущение, что надо снова разыскивать VisualStudio 6.0 и ставить оттуда MSDN - уж больно там все просто расписано :)

Размещено в Код LISP, Функции LISP · Метки: , ,



Поделитесь своим мнением


Я не робот.