Commit 37d54b99 by Florian Villoing Committed by Arnaud Charlet

g-dirope.adb (Remove_Dir): In case we are removing directories recursively...

2007-09-26  Florian Villoing  <villoing@adacore.com>

	* g-dirope.adb (Remove_Dir): In case we are removing directories
	recursively, make sure that if an exception is raised during the
	processing, the current working directory is reset to its initial
	value before propagating the exception.

From-SVN: r128792
parent da2ac8c2
......@@ -743,32 +743,52 @@ package body GNAT.Directory_Operations is
-- Remove directory and all files and directories that it may contain
else
Change_Dir (Dir_Name);
Open (Working_Dir, ".");
-- Substantial comments needed. See RH for revision 1.50 ???
loop
Read (Working_Dir, Str, Last);
exit when Last = 0;
begin
Change_Dir (Dir_Name);
Open (Working_Dir, ".");
if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
if Str (1 .. Last) /= "." and then Str (1 .. Last) /= ".." then
Remove_Dir (Str (1 .. Last), True);
Remove_Dir (Str (1 .. Last));
end if;
loop
Read (Working_Dir, Str, Last);
exit when Last = 0;
else
GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
if GNAT.OS_Lib.Is_Directory (Str (1 .. Last)) then
if Str (1 .. Last) /= "."
and then
Str (1 .. Last) /= ".."
then
Remove_Dir (Str (1 .. Last), True);
Remove_Dir (Str (1 .. Last));
end if;
else
GNAT.OS_Lib.Delete_File (Str (1 .. Last), Success);
if not Success then
Change_Dir (Current_Dir);
raise Directory_Error;
if not Success then
Change_Dir (Current_Dir);
raise Directory_Error;
end if;
end if;
end if;
end loop;
end loop;
Change_Dir (Current_Dir);
Close (Working_Dir);
Remove_Dir (Dir_Name);
exception
when others =>
Change_Dir (Current_Dir);
Close (Working_Dir);
Remove_Dir (Dir_Name);
-- An exception occurred. We must make sure the current working
-- directory is unchanged.
Change_Dir (Current_Dir);
-- What if the Change_Dir raises an exception itself, shouldn't
-- that be protected? ???
raise;
end;
end if;
end Remove_Dir;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment