Как преобразовать путь к файлу в допустимый путь к файлу в Java 1.7
Используя Java 1.6, Filepath может быть введен пользователем, а затем я применяю различные регулярные выражения для удаления символов, которые являются недопустимыми для платформы (например, "?" Недопустим в Windows), и проверяю длину пути, чтобы убедиться, что мы в итоге имеем правильный путь к файлу для ОС, прежде чем пытаться создать путь к файлу.
Но есть две проблемы:
- Трудно понять, что действительно или нет для каждой платформы.
- Я делаю предположения на основе файловой системы по умолчанию для платформы, но, конечно, система OSX может записывать в файловую систему не Mac, такую как FAT32, и в этом случае эти проверки будут недействительными.
Так что я надеялся, что будет лучший способ сделать это с NIO2 в Java 7, но пока не нашел решения, есть ли?
3 ответа
В зависимости от ожидаемого результата (исправленная строка "Недопустимая позиция символа? Исключение"), это должно дать вам представление о том, что можно сделать:
import java.io.File;
import java.nio.file.InvalidPathException;
public class Test {
public static final void main(final String[] args) {
final String current = new File(".").toPath().toAbsolutePath().normalize().toFile().toString();
Test.correctPath(current);
Test.correctPath(current + "aValidExpression");
Test.correctPath(current + "aValidExpression?;:-&é");
Test.correctPath(current + "aValidExpr//ession?;:-&é");
Test.correctPath(current + "aValidExpre\\ssion?;:-&é");
}
public static final String correctPath(final String path) {
try {
final String returnValue = new File(path).toPath().toAbsolutePath().normalize().toFile().toString();
System.out.println(returnValue);
return returnValue;
} catch (final InvalidPathException e) {
System.err.println(e.getMessage());
final int errorIndex = e.getIndex();
final String newPath = path.substring(0, errorIndex - 1) + path.substring(errorIndex + 1);
return Test.correctPath(newPath);
}
}
}
Я надеюсь, что это помогает.
Ключом к вашему вопросу является фраза "удалить символы, которые являются недопустимыми для платформы". Различные String
в Path
функции преобразования, такие как get()
а также resolve()
, скажет вам, была ли строка допустимой как путь, но не скажет, почему она недействительна. Один из способов быть недействительным - содержать недопустимые символы. Другим было бы иметь, скажем, слишком много слэш-символов вместе. Несмотря на это, библиотека не дает больше информации, чем эта; он не предоставляет средств для помощи в проверке ввода пользователя любым способом, который помог бы пользователю исправить ошибку ввода. По общему признанию, это должно быть стандартной практикой, но вряд ли это вообще практика.
Апшот: Вы должны будете написать такую библиотеку валидации самостоятельно, если хотите ее иметь. Сверху: Вы, конечно, не единственный человек с такой проблемой.
Я думаю, вы должны посмотреть на Path.getPath
public static Path get(String first,
String... more)
getPath("/foo","bar","gus")-->/foo/bar/gus
Преобразует строку пути или последовательность строк, которые при объединении образуют строку пути, в путь. Если больше не определяет какие-либо элементы, тогда значением первого параметра является строка пути для преобразования. Если more указывает один или несколько элементов, то каждая непустая строка, включая первую, считается последовательностью элементов имени (см. Путь) и объединяется для формирования строки пути. Сведения о том, как соединяются строки, зависят от поставщика, но обычно они объединяются с использованием разделителя имен в качестве разделителя. Например, если разделителем имен является "/" и вызывается getPath ("/ foo", "bar", "gus"), то строка пути "/foo/bar/gus" преобразуется в Path. Path, представляющий пустой путь, возвращается, если first является пустой строкой, а more не содержит непустых строк.