Удалить имя файла из URL/пути в java

Как удалить имя файла из URL или строки?

String os = System.getProperty("os.name").toLowerCase();
        String nativeDir = Game.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString();

        //Remove the <name>.jar from the string
        if(nativeDir.endsWith(".jar"))
            nativeDir = nativeDir.substring(0, nativeDir.lastIndexOf("/"));

        //Load the right native files
        for(File f : (new File(nativeDir + File.separator + "lib" + File.separator + "native")).listFiles()){
            if(f.isDirectory() && os.contains(f.getName().toLowerCase())){
                System.setProperty("org.lwjgl.librarypath", f.getAbsolutePath()); break;
            }
        }

Это то, что у меня есть прямо сейчас, и это работает. Насколько я знаю, поскольку я использую «/», это будет работать только для окон. Я хочу сделать его независимым от платформы


person Yemto    schedule 17.02.2014    source источник
comment
stackoverflow .com/questions/8075373/   -  person selalerer    schedule 17.02.2014
comment
Это / не окна. `\` есть!   -  person bobbel    schedule 17.02.2014


Ответы (9)


Рассмотрите возможность использования org.apache.commons.io.FilenameUtils

Вы можете извлечь базовый путь, имя файла, расширения и т. д. с любым разделителем файлов:

String url = "C:\\windows\\system32\\cmd.exe";

String baseUrl = FilenameUtils.getPath(url);
String myFile = FilenameUtils.getBaseName(url)
                + "." + FilenameUtils.getExtension(url);

System.out.println(baseUrl);
System.out.println(myFile);

Дает,

windows\system32\
cmd.exe

С URL-адресом; String url = "C:/windows/system32/cmd.exe";

Это дало бы;

windows/system32/
cmd.exe
person StoopidDonut    schedule 17.02.2014
comment
У меня нет FilenameUtils Я не могу импортировать org.apache.commons.io.FilenameUtils. - person Yemto; 17.02.2014
comment
@yemto не может импортировать, не должен был бы или не знает, какая у него есть библиотека? - person StoopidDonut; 18.02.2014
comment
@PopoFido о, я не люблю использовать библиотеки, особенно для чего-то, что должно быть таким простым. - person Yemto; 18.02.2014
comment
А буква диска? - person ed22; 31.07.2021

Используя java.nio.file; (афаик появился после J2SE 1.7), это просто решило мою проблему:

Path path = Paths.get(fileNameWithFullPath);
String directory = path.getParent().toString();
person saygley    schedule 05.01.2018
comment
Плохо работает с URL-адресами HTTP, которые специально не упоминались в вопросе, но могут представлять интерес для некоторых, просматривающих эти ответы. - person Nate; 04.01.2019

Вы используете File.separator в другой строке. Почему бы не использовать его также для вашего lastIndexOf()?

nativeDir = nativeDir.substring(0, nativeDir.lastIndexOf(File.separator));
person Dirk Fauth    schedule 17.02.2014
comment
Потому что он возвращает не то для моей системы. Но мне все равно, станет ли он C:\something\something\something/something - person Yemto; 17.02.2014
comment
File.separator возвращает разделитель файлов, зависящий от вашей системы. Таким образом, в Windows вы получите \, а в Unix — /. Вот почему вы должны использовать File.separator. - person Dirk Fauth; 17.02.2014
comment
Game.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString() возвращает D:/Dropbox/NetBeansProjects/, а System.out.println(File.separator) возвращает \, так что это неправильно. у меня виндовс 7 64бит - person Yemto; 17.02.2014
comment
Хорошо, если этот метод всегда возвращает /, вы можете сначала выполнить замену, чтобы в любом случае обеспечить одно и то же состояние. String.replace() может помочь - person Dirk Fauth; 18.02.2014
comment
Обратите внимание, что для получения имени файла выражение должно быть чем-то вроде nativeDir.substring(nativeDir.lastIndexOf(File.separator) + 1) (то есть подстрока от разделителя, до конца). - person rsenna; 25.11.2019

Стандартная библиотека может справиться с этим, начиная с Java 7.

Path pathOnly;

if (file.getNameCount() > 0) {
  pathOnly = file.subpath(0, file.getNameCount() - 1);
} else {
  pathOnly = file;
}

fileFunction.accept(pathOnly, file.getFileName());
person Jeremy Sigrist    schedule 14.03.2017
comment
В документации path.getNameCount() указано: количество элементов в пути или 0, если этот путь представляет только корневой компонент. Это может вызвать проблемы... - person Andrew; 13.07.2017

File file = new File(path);
String pathWithoutFileName = file.getParent();

где путь может быть C:\Users\имя_пользователя\Desktop\file.txt

person Zoe Lubanza    schedule 09.08.2020

Вместо «/» используйте File.separator< /а>. Это либо /, либо \, в зависимости от платформы. Если это не решает вашу проблему, используйте FileSystem.getSeparator(): вы можете передавать разные файловые системы вместо значения по умолчанию.

person Chthonic Project    schedule 17.02.2014
comment
Я бы. Но File.separator возвращает \, а nativeDir использует / - person Yemto; 17.02.2014
comment
Тогда разве что-то вроде этого не должно работать? if(nativeDir.endsWith(".jar")){ int index = Math.max(nativeDir.lastIndexOf("/"), nativeDir.lastIndexOf("\\")); nativeDir = nativeDir.substring(0, index); } - person Yemto; 17.02.2014
comment
Добавлено больше информации. Это должно устранить разницу с собственным каталогом. - person Chthonic Project; 17.02.2014

Я решаю эту проблему, используя регулярное выражение.

Для окон:

String path = "";
String filename = "d:\\folder1\\subfolder11\\file.ext";
String regEx4Win = "\\\\(?=[^\\\\]+$)";
String[] tokens = filename.split(regEx4Win);
if (tokens.length > 0)
   path = tokens[0]; // path -> d:\folder1\subfolder11
person Ksiądz Pistolet    schedule 03.03.2017

Пожалуйста, попробуйте следующий код:

file.getPath().replace(file.getName(), "");
person Amin Arab    schedule 09.07.2020

Котлин-решение:

val file = File( "/folder1/folder2/folder3/readme.txt")
val pathOnly = file.absolutePath.substringBeforeLast( File.separator )
println( pathOnly )

производит этот результат:

/папка1/папка2/папка3

person Interkot    schedule 16.05.2021