Skip to content
This repository was archived by the owner on Oct 11, 2024. It is now read-only.

Commit 6bcc3d2

Browse files
committed
Test case and proposed fix for codehaus-plexus#38
1 parent ac81ee2 commit 6bcc3d2

File tree

2 files changed

+32
-23
lines changed

2 files changed

+32
-23
lines changed

src/main/java/org/codehaus/plexus/util/FileUtils.java

100644100755
+13-13
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,11 @@
5858
import org.codehaus.plexus.util.io.InputStreamFacade;
5959
import org.codehaus.plexus.util.io.URLInputStreamFacade;
6060

61-
import java.io.BufferedReader;
62-
import java.io.File;
63-
import java.io.FileInputStream;
64-
import java.io.FileOutputStream;
65-
import java.io.FileReader;
66-
import java.io.FileWriter;
67-
import java.io.IOException;
68-
import java.io.InputStream;
69-
import java.io.InputStreamReader;
70-
import java.io.OutputStream;
71-
import java.io.OutputStreamWriter;
72-
import java.io.Reader;
73-
import java.io.Writer;
61+
import java.io.*;
7462
import java.net.URL;
7563
import java.nio.channels.FileChannel;
64+
import java.nio.file.Files;
65+
import java.nio.file.attribute.DosFileAttributes;
7666
import java.security.SecureRandom;
7767
import java.text.DecimalFormat;
7868
import java.util.ArrayList;
@@ -1094,6 +1084,16 @@ public static void copyFile( final File source, final File destination )
10941084
private static void doCopyFile( File source, File destination )
10951085
throws IOException
10961086
{
1087+
// Special-case for Windows read-only file attribute -- if it's set, unset it so that replacement of the
1088+
// destination doesn't fail. Files.copy will apparently not REPLACE_EXISTING in that case, at least on Windows.
1089+
if (Os.isFamily(Os.FAMILY_WINDOWS)
1090+
&& destination.exists()
1091+
&& !destination.canWrite()
1092+
&& Files.readAttributes(destination.toPath(), DosFileAttributes.class)
1093+
.isReadOnly()) {
1094+
destination.setWritable(true);
1095+
}
1096+
10971097
// offload to operating system if supported
10981098
if ( Java7Detector.isJava7() )
10991099
{

src/test/java/org/codehaus/plexus/util/FileUtilsTest.java

100644100755
+19-10
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,11 @@
1616
* limitations under the License.
1717
*/
1818

19-
import java.io.ByteArrayInputStream;
20-
import java.io.File;
21-
import java.io.FileInputStream;
22-
import java.io.FileOutputStream;
23-
import java.io.IOException;
24-
import java.io.InputStream;
25-
import java.io.OutputStream;
26-
import java.io.OutputStreamWriter;
27-
import java.io.Reader;
28-
import java.io.Writer;
19+
import org.junit.Assume;
20+
21+
import java.io.*;
2922
import java.net.URL;
23+
import java.nio.file.Files;
3024
import java.util.Properties;
3125

3226
/**
@@ -394,6 +388,21 @@ public void testCopyFile3()
394388
assertTrue( "Check Exist", destination.exists() );
395389
assertTrue( "Check Full copy", destination.length() == testFile2Size );
396390
}
391+
392+
public void testCopyOverReadOnlyFile()
393+
throws IOException
394+
{
395+
final File destination = new File( getTestDirectory(), "copy2.txt" );
396+
397+
// Make sure file exists and is read-only
398+
assertTrue(destination.createNewFile());
399+
assertTrue(destination.setReadOnly());;
400+
401+
// Copy
402+
FileUtils.copyFile( testFile1, destination );
403+
assertTrue( "Check Exist", destination.exists() );
404+
assertTrue( "Check Full copy", destination.length() == testFile2Size );
405+
}
397406

398407
// copyFileIfModified
399408

0 commit comments

Comments
 (0)