Works fine on my Mac OS X 10.4/Java 5 On Wed, Mar 4, 2009 at 11:13 PM, Niklas Gustavsson <[email protected]> wrote: > On Mon, Mar 2, 2009 at 4:54 PM, Niklas Gustavsson <[email protected]> > wrote: >> Let me whip up a prototype and we can test it on the available platforms. > > Alright, here's a prototype that I would much appreciate if all of you > would take the time to test. First of all, you need to set the > FILE_SYSTEM_TYPE to the correct value (this is only used for > verification in the tests). On case sensitive file systems (most of > the *nix file systems), this should be set to > FileSystemType.CaseSensitive. On NTFS it should be set to > CaseInsensitiveMissingAsTrue, and on case-insensitive HFS to > CaseInsensitiveMissingAsFalse. It would be very interesting to have > this code tested on other file systems. If you do, please report the > file system and the test results. > > /niklas > > package org.apache.ftpserver.filesystem.nativefs.impl; > > import java.io.File; > import java.io.FilenameFilter; > import java.io.IOException; > > import junit.framework.TestCase; > > public class FileEqualsTest extends TestCase { > > private enum FileSystemType { > CaseSensitive, > // non-existing files with different casing are equal > // e.g. NTFS > CaseInsensitiveMissingAsTrue, > // non-existing files with different casing are non-equal > // e.g. HFS > CaseInsensitiveMissingAsFalse > }; > > private static final FileSystemType FILE_SYSTEM_TYPE = > FileSystemType.CaseSensitive; > > private boolean isCaseSensitive() { > return FILE_SYSTEM_TYPE == FileSystemType.CaseSensitive; > } > > private boolean isCaseInsensitive() { > return FILE_SYSTEM_TYPE != FileSystemType.CaseSensitive; > } > > �...@override > protected void setUp() throws Exception { > System.out.println("File system type: " + FILE_SYSTEM_TYPE); > super.setUp(); > } > > public void testSimple() throws IOException { > File f1 = new File("foo"); > assertTrue(f1.createNewFile()); > File f2 = new File("foo"); > > assertTrue(equals(f1, f2)); > } > > public void testNonExistingButSimple() { > File f1 = new File("foo"); > File f2 = new File("foo"); > > assertTrue(equals(f1, f2)); > } > > public void testDifferentCase() throws IOException { > File f1 = new File("foo"); > assertTrue(f1.createNewFile()); > File f2 = new File("FOO"); > > // if this succeeds, we have two different files > assertEquals(isCaseSensitive(), f2.createNewFile()); > > assertEquals(isCaseInsensitive(), equals(f1, f2)); > } > > public void testDifferentCaseNonExisting() throws IOException { > File f1 = new File("foo"); > File f2 = new File("FOO"); > > assertEquals(FILE_SYSTEM_TYPE == > FileSystemType.CaseInsensitiveMissingAsTrue, equals(f1, f2)); > } > > public void testSameNameDifferentParent() throws IOException { > File f1 = new File("foo"); > assertTrue(f1.createNewFile()); > File dir2 = new File("dir"); > assertTrue(dir2.mkdir()); > File f2 = new File(dir2, "foo"); > assertTrue(f2.createNewFile()); > > assertFalse(equals(f1, f2)); > } > > public boolean equals(final File f1, final File f2) { > if (f1 == null || f2 == null) { > return false; > } > > if (f1.equals(f2)) { > // file equals, valid on all file systems > return true; > } else { > boolean f1Exists = f1.exists(); > boolean f2Exists = f2.exists(); > > if (f1.getName().equalsIgnoreCase(f2.getName())) { > // same name, do both exist? > if (f1Exists && f2Exists) { > // both files exists, do they have the same parent? > > // TODO should we use canonical or absolute path? > File f1Parent = f1.getAbsoluteFile().getParentFile(); > File f2Parent = f2.getAbsoluteFile().getParentFile(); > > if (f1Parent != null && f2Parent != null) { > if (equals(f1Parent, f2Parent)) { > // okay, if we got here, the parents are the same, > // the file names are the same and both files > exists > // let's check if there are multiple files > or only one in the parent > // with that name > > > // choosing either parent should be fine, > they are equal > String[] files = f1Parent > .list(new FilenameFilter() { > public boolean accept(File > dir, String name) { > return name.equalsIgnoreCase(f1 > .getName()); > } > }); > > if (files.length == 1) { > // exactly one file matched the name, > the files must be equal > return true; > } else if (files.length > 1) { > return false; > } else { > // no file matching, must be a bug somewhere > throw new RuntimeException("Should not > happen"); > } > } else { > // different parents, return false > return false; > } > } else if (f1Parent == null && f2Parent == null) { > // no parents, we can do nothing more and thus > have to return false > return false; > } else { > // different parents > return false; > } > } else if (!f1Exists && !f2Exists) { > // none of the file exists, we can only trust the > equals result (which by now must be false) > return false; > } else { > // only one of the files exists, return false > return false; > } > } else { > // file names not equal > return false; > } > } > } > > �...@override > protected void tearDown() throws Exception { > new File("foo").delete(); > new File("FOO").delete(); > new File("dir/foo").delete(); > new File("dir").delete(); > } > > } >
-- Regards, Cordialement, Emmanuel Lécharny www.iktek.com
