Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e86daf0a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Rename should behave like create: avoid conflict."

parents c30ac216 aa44476f
Loading
Loading
Loading
Loading
+36 −11
Original line number Original line Diff line number Diff line
@@ -605,6 +605,22 @@ public class FileUtils {
        return null;
        return null;
    }
    }


    private static File buildUniqueFileWithExtension(File parent, String name, String ext)
            throws FileNotFoundException {
        File file = buildFile(parent, name, ext);

        // If conflicting file, try adding counter suffix
        int n = 0;
        while (file.exists()) {
            if (n++ >= 32) {
                throw new FileNotFoundException("Failed to create unique file");
            }
            file = buildFile(parent, name + " (" + n + ")", ext);
        }

        return file;
    }

    /**
    /**
     * Generates a unique file name under the given parent directory. If the display name doesn't
     * Generates a unique file name under the given parent directory. If the display name doesn't
     * have an extension that matches the requested MIME type, the default extension for that MIME
     * have an extension that matches the requested MIME type, the default extension for that MIME
@@ -619,20 +635,29 @@ public class FileUtils {
    public static File buildUniqueFile(File parent, String mimeType, String displayName)
    public static File buildUniqueFile(File parent, String mimeType, String displayName)
            throws FileNotFoundException {
            throws FileNotFoundException {
        final String[] parts = splitFileName(mimeType, displayName);
        final String[] parts = splitFileName(mimeType, displayName);
        final String name = parts[0];
        return buildUniqueFileWithExtension(parent, parts[0], parts[1]);
        final String ext = parts[1];
        File file = buildFile(parent, name, ext);

        // If conflicting file, try adding counter suffix
        int n = 0;
        while (file.exists()) {
            if (n++ >= 32) {
                throw new FileNotFoundException("Failed to create unique file");
    }
    }
            file = buildFile(parent, name + " (" + n + ")", ext);

    /**
     * Generates a unique file name under the given parent directory, keeping
     * any extension intact.
     */
    public static File buildUniqueFile(File parent, String displayName)
            throws FileNotFoundException {
        final String name;
        final String ext;

        // Extract requested extension from display name
        final int lastDot = displayName.lastIndexOf('.');
        if (lastDot >= 0) {
            name = displayName.substring(0, lastDot);
            ext = displayName.substring(lastDot + 1);
        } else {
            name = displayName;
            ext = null;
        }
        }


        return file;
        return buildUniqueFileWithExtension(parent, name, ext);
    }
    }


    /**
    /**
+14 −0
Original line number Original line Diff line number Diff line
@@ -297,6 +297,20 @@ public class FileUtilsTest extends AndroidTestCase {
                FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
                FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
    }
    }


    public void testBuildUniqueFile_mimeless() throws Exception {
        assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg"));
        new File(mTarget, "test.jpg").createNewFile();
        assertNameEquals("test (1).jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg"));

        assertNameEquals("test", FileUtils.buildUniqueFile(mTarget, "test"));
        new File(mTarget, "test").createNewFile();
        assertNameEquals("test (1)", FileUtils.buildUniqueFile(mTarget, "test"));

        assertNameEquals("test.foo.bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar"));
        new File(mTarget, "test.foo.bar").createNewFile();
        assertNameEquals("test.foo (1).bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar"));
    }

    private static void assertNameEquals(String expected, File actual) {
    private static void assertNameEquals(String expected, File actual) {
        assertEquals(expected, actual.getName());
        assertEquals(expected, actual.getName());
    }
    }
+1 −4
Original line number Original line Diff line number Diff line
@@ -473,10 +473,7 @@ public class ExternalStorageProvider extends DocumentsProvider {
        displayName = FileUtils.buildValidFatFilename(displayName);
        displayName = FileUtils.buildValidFatFilename(displayName);


        final File before = getFileForDocId(docId);
        final File before = getFileForDocId(docId);
        final File after = new File(before.getParentFile(), displayName);
        final File after = FileUtils.buildUniqueFile(before.getParentFile(), displayName);
        if (after.exists()) {
            throw new IllegalStateException("Already exists " + after);
        }
        if (!before.renameTo(after)) {
        if (!before.renameTo(after)) {
            throw new IllegalStateException("Failed to rename to " + after);
            throw new IllegalStateException("Failed to rename to " + after);
        }
        }