从java中的URL / Path中删除文件名

时间:2014-02-17 12:35:45

标签: java string filepath platform-independent

如何从网址或字符串中删除文件名?

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;
            }
        }

这就是我现在所拥有的,而且它有效。据我所知,因为我使用“/”它只适用于Windows。我想让它独立于平台

10 个答案:

答案 0 :(得分:16)

考虑使用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

答案 1 :(得分:8)

您正在另一行使用File.separator。为什么不将它也用于你的lastIndexOf()?

nativeDir = nativeDir.substring(0, nativeDir.lastIndexOf(File.separator));

答案 2 :(得分:8)

利用 java.nio.file ; (在J2SE 1.7之后引入afaik)这简单地解决了我的问题:

Path path = Paths.get(fileNameWithFullPath);
String directory = path.getParent().toString();

答案 3 :(得分:3)

从Java 7开始,标准库可以处理此问题

Path pathOnly;

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

fileFunction.accept(pathOnly, file.getFileName());

答案 4 :(得分:1)

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

其中路径可能是“ C:\ Users \ userName \ Desktop \ file.txt”

答案 5 :(得分:0)

使用File.separator代替“/”。它可以是/\,具体取决于平台。如果这不能解决您的问题,请使用FileSystem.getSeparator():您可以传递不同的文件系统,而不是默认文件系统。

答案 6 :(得分:0)

[回复旧帖子 ^ _ ^ ]

根据http://farenda.com/java/java-filename-from-path/的说法,还有另一种方法,由于使用了 Java SE 7或8的java.nio.file类,可能会更方便/强>

  

这是从Path获取文件名的最简单方法:

     

Path path = Paths.get("/proc/version"); System.out.println("path.getFileName(): " + path.getFileName().toString());

     

以上代码产生:   path.getFileName(): version

答案 7 :(得分:0)

我使用正则表达式来解决这个问题。

对于Windows:

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

答案 8 :(得分:0)

请尝试以下代码:

file.getPath().replace(file.getName(), "");

答案 9 :(得分:0)

Kotlin 解决方案:

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

产生这个结果:

/folder1/folder2/folder3