Le 29/09/2010 15:57, Alan Bateman a écrit :
I need a reviewer for a change to java.io.File's setReadOnly and
setWritable methods so that they don't change the DOS readonly
attribute on directories (or folders as Windows calls them). These
methods have never worked correctly for directories on Windows because
the semantics of this attribute is different for directories (it
determines if the directory can be deleted, not whether is is
writable, and is used by Windows Explorer to determine if the
directory is special, sending it off looking for a hidden Desktop.ini
file). Early on in jdk7, the canWrite method was changed to ignore the
readonly attribute on directories so changing the set* methods to
ignore the attribute restores the status quo. I should say that
changing the implementation has some risk. If it does cause problems
they we may need to include a compatibility switch. The alternative to
ignoring the readonly attribute is to insert a deny rule into the
directory's DACL (when on NTFS) but that has a lot of potential to
cause problems for end-users. As part of the change proposed here, the
SetAccess test has been changed so that it no longer execs "ls -l" and
this fixes another bug (6464744) where the test fails if the sticky
bit is set. The webrev with the changes is here:
http://cr.openjdk.java.net/~alanb/6728842/webrev/
Thanks,
Alan.
There is a small copy/paste error in setAccess.doTest() for Windows
specific tests,
the exception message of the thrown Exception doesn't match the test.
// setWritable should fail on directories because the DOS
readonly
148 // attribute prevents a directory from being deleted.
149 if (f.setWritable(false, true))
150 throw new Exception(f + ": setWritable(false, true)
Succeeded");
151 if (f.setWritable(false, false))
152 throw new Exception(f + ": setWritable(false, true)
Succeeded");
153 if (f.setWritable(false))
154 throw new Exception(f + ": setWritable(false, true)
Succeeded");
should be
// setWritable should fail on directories because the DOS
readonly
148 // attribute prevents a directory from being deleted.
149 if (f.setWritable(false, true))
150 throw new Exception(f + ": setWritable(false, true)
Succeeded");
151 if (f.setWritable(false, false))
152 throw new Exception(f + ": setWritable(false, false)
Succeeded");
153 if (f.setWritable(false))
154 throw new Exception(f + ": setWritable(false)
Succeeded");
Other changes look fine.
Rémi