Merge "Rename should behave like create: avoid conflict." into nyc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b90ae85acc
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user