rmdir frequently fails with the 'MATLAB:RMDIR:SomeDirectoriesNotRemoved' error
14 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Kouichi C. Nakamura
el 1 de Jun. de 2016
Comentada: Volodymyr Zenin
el 10 de Mzo. de 2020
I'm using matlab.unittest.fixtures for unit testing with matlab.unittest.TestCase. The operation involves file conversions, so I think it makes sense to use "setup" method for preparing a work folder and "teardown" for deleting the same folder.
The removal of the folder is done by rmdir function. It works fine, but 3 to 5 times per 10 trials, it fails to delete the folder with an error message 'MATLAB:RMDIR:SomeDirectoriesNotRemoved'.
This is essentially about the same issue, but putting rehash() after rmdir did not help. It's just unpredictable at the moment. I checked the folder's write permission with fileattrib function. Write permission is surely granted, but it still fails.
Only to illustrate the point, I wrote much simpler code. Interestingly, I successfully reproduced the problem.
clc;
str = 'TEMP_FOLDER';
for i = 1:100
if isdir(str)
rmdir(str,'s')
rehash
end
mkdir(str);
A = rand(10);
save(fullfile(str,'A'),'A')
[~,s] = fileattrib(str);
fprintf('UserWrite %d\n',s.UserWrite);
try
rmdir(str,'s');
rehash
catch mex
disp(mex)
throw(mex)
end
fprintf('OK %d\n',i);
end
Although it's quite random, usually it fails within 10 trials.
UserWrite 1
OK 1
UserWrite 1
OK 2
UserWrite 1
MException with properties:
identifier: 'MATLAB:RMDIR:SomeDirectoriesNotRemoved'
message: 'D:\xxxxx\TEMP_FOLDER could not be removed.'
cause: {0x1 cell}
stack: [0x1 struct]
D:\xxxxx\TEMP_FOLDER could not be removed.
Does anyone know how to solve this? I tested on Windows 7 (R2016a); the same code worked on OS X (R2016a).
2 comentarios
Respuesta aceptada
Philip Borghesani
el 2 de Jun. de 2016
This is often caused by interaction with your virus scanner that happens to still be scanning / looking into files that may already have been deleted in the directory. Short of disabling your virus scanner the only solution is wait a short time and retry the operation. I suggest using the status outputs from rmdir to write a short loop something like this: (untested)
for try=1:4
status=rmdir(str,s);
if status==1
break
end
sleep(.1*try)
end
if status==0
warning('mytest:leakedDir','Warning failed to clean up directory %s", str);
end
4 comentarios
Volodymyr Zenin
el 10 de Mzo. de 2020
Thank you, Philip Borghesani, for giving this solution - I had the same problem as the Kouichi C. Nakamura, and I suspect OneDrive in interference... By the way, please correct your answer: 1) try cannot be used as variable - it is kind of function in new Matlab; 2) there is no more such function as sleep, one should use pause instead.
Más respuestas (1)
Ver también
Categorías
Más información sobre Search Path en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!