Lisp HUG Maillist Archive

Deleting directories

I am searching for a method of deleting directories in Lisp. I am currently
only interested in getting it to work under Windows. I was surprised to
discover that there appears to be no direct way to remove a directory, even
though there is a way to create one. I attempted to remove the directory
using:

(delete-file "d:\\code\\lisp\\bleh\\")

and receved this error:

Error: Failed to DELETE file d:\code\lisp\bleh\: 5: Access is denied.(5).

I also tried using an inteface to the windows API as follows:

(fli:define-foreign-function
 (remove-directory "RemoveDirectoryA")
 ((lpstring :pointer))
 :result-type long)

(fli:define-foreign-function
 (last-win32-err "GetLastError")
 ()
 :result-type long)

(defun rmdir(path)
  (let ((external-format (if (string= (software-type) "Windows NT")
			     :unicode
			   :ascii))
	(error-code nil))
    (fli:with-foreign-string (new-ptr element-count byte-count
				      :external-format external-format)
			     path
			     (declare (ignore element-count byte-count))
			     (setq error-code (remove-directory new-ptr))
			     (unless (not (zerop error-code))
			       (setq error-code (last-win32-err))
			       (format t "Error Code: ~A~%" error-code)))))

Which does not work and windows returns an error 2, which I believe is a
file not found error.

Any suggestions? Does anyone out there have a similar issue? Is my code
broken in some way I am missing? Any assistance would be greatly
appreciated.

Paul D. Lathrop



Re: Deleting directories

I think you might want to look at LW:DELETE-DIRECTORY. It works on LWW
(ver 4.2.6 for sure).

Regards,

-ram

"Paul D. Lathrop" <pdlathro@chartermi.net> writes:

> I am searching for a method of deleting directories in Lisp. I am currently
> only interested in getting it to work under Windows. I was surprised to
> discover that there appears to be no direct way to remove a directory, even
> though there is a way to create one. I attempted to remove the directory
> using:
>
> (delete-file "d:\\code\\lisp\\bleh\\")
>
> and receved this error:
>
> Error: Failed to DELETE file d:\code\lisp\bleh\: 5: Access is denied.(5).
>
> I also tried using an inteface to the windows API as follows:
>
> (fli:define-foreign-function
>  (remove-directory "RemoveDirectoryA")
>  ((lpstring :pointer))
>  :result-type long)
>
> (fli:define-foreign-function
>  (last-win32-err "GetLastError")
>  ()
>  :result-type long)
>
> (defun rmdir(path)
>   (let ((external-format (if (string= (software-type) "Windows NT")
> 			     :unicode
> 			   :ascii))
> 	(error-code nil))
>     (fli:with-foreign-string (new-ptr element-count byte-count
> 				      :external-format external-format)
> 			     path
> 			     (declare (ignore element-count byte-count))
> 			     (setq error-code (remove-directory new-ptr))
> 			     (unless (not (zerop error-code))
> 			       (setq error-code (last-win32-err))
> 			       (format t "Error Code: ~A~%" error-code)))))
>
> Which does not work and windows returns an error 2, which I believe is a
> file not found error.
>
> Any suggestions? Does anyone out there have a similar issue? Is my code
> broken in some way I am missing? Any assistance would be greatly
> appreciated.
>
> Paul D. Lathrop


Updated at: 2020-12-10 09:02 UTC