@@ -249,6 +249,10 @@ function mkpath(path::AbstractString; mode::Integer = 0o777)
249249    path
250250end 
251251
252+ #  Files that were requested to be deleted but can't be by the current process
253+ #  i.e. loaded DLLs on Windows
254+ delayed_delete_dir () =  joinpath (tempdir (), " julia_delayed_deletes" 
255+ 
252256""" 
253257    rm(path::AbstractString; force::Bool=false, recursive::Bool=false) 
254258
@@ -282,25 +286,28 @@ function rm(path::AbstractString; force::Bool=false, recursive::Bool=false)
282286                        #  Loaded DLLs cannot be deleted on Windows, even with posix delete mode
283287                        #  but they can be moved. So move out to allow the dir to be deleted
284288                        #  TODO : Add a mechanism to delete these moved files after dlclose or process exit
285-                         dir =  mkpath (joinpath ( tempdir (),  " julia_delayed_deletes " 
289+                         dir =  mkpath (delayed_delete_dir ( ))
286290                        temp_path =  tempname (dir, cleanup =  false ) *  " _" *  basename (path)
287291                        @debug  " Could not delete DLL most likely because it is loaded, moving to tempdir" 
288292                        mv (path, temp_path)
293+                         return 
289294                    end 
290295                end 
291296            end 
292297            rethrow ()
293298        end 
294299    else 
295300        if  recursive
296-             for  p  in   readdir (path) 
297-                 try 
298-                     rm ( joinpath (path, p), force = force, recursive = true ) 
299-                 catch  err 
300-                     if   ! ( isa ( err, IOError)  &&  err . code == Base . UV_EACCES) 
301-                         rethrow ( err)
301+             try 
302+                 for  p  in   readdir (path) 
303+                     try 
304+                          rm ( joinpath (path, p), force = force, recursive = true ) 
305+                     catch   err
306+                         ( isa ( err, IOError)  &&  err . code == Base . UV_EACCES)  ||   rethrow ( )
302307                    end 
303308                end 
309+             catch  err
310+                 (isa (err, IOError) &&  err. code== Base. UV_EACCES) ||  rethrow ()
304311            end 
305312        end 
306313        req =  Libc. malloc (_sizeof_uv_fs)
0 commit comments