@@ -249,6 +249,10 @@ function mkpath(path::AbstractString; mode::Integer = 0o777)
249
249
path
250
250
end
251
251
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
+
252
256
"""
253
257
rm(path::AbstractString; force::Bool=false, recursive::Bool=false)
254
258
@@ -282,25 +286,28 @@ function rm(path::AbstractString; force::Bool=false, recursive::Bool=false)
282
286
# Loaded DLLs cannot be deleted on Windows, even with posix delete mode
283
287
# but they can be moved. So move out to allow the dir to be deleted
284
288
# 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 ( ))
286
290
temp_path = tempname (dir, cleanup = false ) * " _" * basename (path)
287
291
@debug " Could not delete DLL most likely because it is loaded, moving to tempdir" path temp_path
288
292
mv (path, temp_path)
293
+ return
289
294
end
290
295
end
291
296
end
292
297
rethrow ()
293
298
end
294
299
else
295
300
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 ( )
302
307
end
303
308
end
309
+ catch err
310
+ (isa (err, IOError) && err. code== Base. UV_EACCES) || rethrow ()
304
311
end
305
312
end
306
313
req = Libc. malloc (_sizeof_uv_fs)
0 commit comments