Rename should behave like create: avoid conflict.
am: 2c89a4c170
Change-Id: I8d288a8afd06bc46d8d3051ce025c0af6c9875fa
This commit is contained in:
@@ -605,6 +605,22 @@ public class FileUtils {
|
||||
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
|
||||
* 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)
|
||||
throws FileNotFoundException {
|
||||
final String[] parts = splitFileName(mimeType, displayName);
|
||||
final String name = parts[0];
|
||||
final String ext = parts[1];
|
||||
File file = buildFile(parent, name, ext);
|
||||
return buildUniqueFileWithExtension(parent, parts[0], parts[1]);
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -297,6 +297,20 @@ public class FileUtilsTest extends AndroidTestCase {
|
||||
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) {
|
||||
assertEquals(expected, actual.getName());
|
||||
}
|
||||
|
||||
@@ -466,10 +466,7 @@ public class ExternalStorageProvider extends DocumentsProvider {
|
||||
displayName = FileUtils.buildValidFatFilename(displayName);
|
||||
|
||||
final File before = getFileForDocId(docId);
|
||||
final File after = new File(before.getParentFile(), displayName);
|
||||
if (after.exists()) {
|
||||
throw new IllegalStateException("Already exists " + after);
|
||||
}
|
||||
final File after = FileUtils.buildUniqueFile(before.getParentFile(), displayName);
|
||||
if (!before.renameTo(after)) {
|
||||
throw new IllegalStateException("Failed to rename to " + after);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user