Merge "Rename should behave like create: avoid conflict." into nyc-mr1-dev

This commit is contained in:
TreeHugger Robot
2016-09-22 00:49:05 +00:00
committed by Android (Google) Code Review
3 changed files with 51 additions and 15 deletions

View File

@@ -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);
} }
return file; /**
* 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 buildUniqueFileWithExtension(parent, name, ext);
} }
/** /**

View File

@@ -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());
} }

View File

@@ -466,10 +466,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);
} }