Remi Rosenthal created IO-787:
---------------------------------
Summary: FileUtils.forceDelete(File file) fails on MacOS
Key: IO-787
URL: https://issues.apache.org/jira/browse/IO-787
Project: Commons IO
Issue Type: Bug
Affects Versions: 2.11.0
Environment: macOS Monterey version 12.2.1
Java Info: Vendor 'Oracle Corporation' URL 'https://java.oracle.com/' Version
'17.0.6' Home '/Library/Java/JavaVirtualMachines/jdk-17.0.6.jdk/Contents/Home'
Reporter: Remi Rosenthal
Attachments: Chromium.app.zip
My codebase has been using FileUtils.cleanDirectory for a while now. Since
upgrading from 2.6 to 2.11.0, we found that the operation sometimes throws an
AccessDeniedException on MacOS but not on the other platforms. More
specifically, 2.8.0 is fine but 2.9.0 onward has the problem.
FileUtils.cleanDirectory calls FileUtils.forceDelete where I believe the
problem originates.
I have not been able to narrow down the necessary conditions to reproduce with
100% confidence but hopefully the contents of the attached zip should preserve
those conditions on another Mac machine.
Then, to reproduce, simply try and call:
{code:java}
FileUtils.forceDelete(file);{code}
on the Chromium.app file.
For me, the resulting stack trace looks like this:
{code:java}
java.io.IOException: Cannot delete file:
/var/folders/4f/4njp3j594893v3y136b6w1z80000gn/T/temp/Chromium.app
at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1344)
at org.myproject.MyTest.testDeleteReadOnlyFile(MyTest.java:107)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at
org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
at
org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
...
Caused by: java.nio.file.AccessDeniedException:
/var/folders/4f/4njp3j594893v3y136b6w1z80000gn/T/temp/Chromium.app/Contents/Frameworks/Chromium
Framework.framework/Versions/105.0.5195.0/_CodeSignature
at
java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
at
java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at
java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at
java.base/sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:248)
at
java.base/sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:110)
at java.base/java.nio.file.Files.deleteIfExists(Files.java:1191)
at
org.apache.commons.io.file.DeletingPathVisitor.postVisitDirectory(DeletingPathVisitor.java:142)
at
org.apache.commons.io.file.DeletingPathVisitor.postVisitDirectory(DeletingPathVisitor.java:37)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2828)
at java.base/java.nio.file.Files.walkFileTree(Files.java:2882)
at org.apache.commons.io.file.PathUtils.visitFileTree(PathUtils.java:971)
at org.apache.commons.io.file.PathUtils.deleteDirectory(PathUtils.java:434)
at org.apache.commons.io.file.PathUtils.delete(PathUtils.java:391)
at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:1341)
... 71 more
{code}
Strangely, the folder "_CodeSignature" doesn't appear to be read-only.
Through bisecting I have narrowed down the commit that introduced the failure
to {_}8ae947bcc796d73b0eab7d94f10a002f66896af3{_}.
The changeset caused FileUtils.forceDelete to call PathUtils.delete with a
StandardDeleteOption.OVERRIDE_READ_ONLY flag. This sounds like it should help
delete read-only files but for some reason does the opposite on MacOS in this
instance. Indeed, a build of commons-io 2.11.0 with this change reverted allows
my file to be deleted.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)