Belirli bir dosyanın yalnızca üst dizin adı nasıl elde edilir


111

dddTest.java dosyasının bulunduğu yol adından nasıl alınır.

File file = new File("C:/aaa/bbb/ccc/ddd/test.java");

1
Bu genel bir dosya için mi yoksa kaynak dosyanızın ana dizinini mi almaya çalışıyorsunuz? İkincisi ise, Java derlemesini anladığınızdan emin değilim. Çalışma zamanında, test.javamuhtemelen programın çalıştırıldığı bilgisayarda bile bulunmayacaktır. .classÇalıştırılan derlenmiş dosyadır. Bu nedenle, bu yalnızca nerede olduğunu bilirseniz işe yarar ddd, bu durumda onu programatik olarak bulmanın bir anlamı yoktur; sadece zor kodlayın.
Mark Peters

Yanıtlar:


141

Kullanım File'ın getParentFile()yöntem ve String.lastIndexOf()almak için sadece acil ebeveyn dizini.

Mark'ın yorumu şunlardan daha iyi bir çözümdür lastIndexOf():

file.getParentFile().getName();

Bu çözümler yalnızca dosyanın bir üst dosyası varsa çalışır (örneğin, bir üst öğe alan dosya yapıcılarından biri aracılığıyla oluşturulur File). getParentFile()Boş olduğunda , Apache Commons 'lastIndexOf gibi bir şeye başvurmanız veya kullanmanız gerekecek :FileNameUtils.getFullPath()

FilenameUtils.getFullPathNoEndSeparator(file.getAbsolutePath());
=> C:/aaa/bbb/ccc/ddd

Öneki ve sondaki ayırıcıyı tutmanın / bırakmanın birkaç çeşidi vardır. FilenameUtilsAdı sonuçtan, kullanımdan lastIndexOfvb. Almak için aynı sınıfı kullanabilirsiniz .


14
İhtiyacın yok lastIndexOf, sadece kullan file.getParentFile().getName().
Mark Peters

13
Her ihtimale karşı. Dönerse null( Filegöreli yol ile örnek oluşturduysanız ) - deneyin file.getAbsoluteFile().getParentFile().getName().
nidu

1
@MarkPeters Bu, yalnızca dosya bir ana Dosya ile oluşturulduğunda çalışır, ancak tahmin ettiğim gibi nispeten nadiren.
Dave Newton

20
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() boş olabilir, bu yüzden kontrol etmelisiniz.


1
Emin olmak için çıktı aşağıdaki gibidir: C: / aaa / bbb / ccc / ddd
Guy Avraham

16

Aşağıda kullanın,

File file = new File("file/path");
String parentPath = file.getAbsoluteFile().getParent();

Altta yatan dosya olmasa bile, bu yöntemin bir üst kümeye sahip olması gerektiğine dikkat çekmek gerekir.
Pace

13

Java 7'de yeni Paths api'sine sahipsiniz . Modern ve en temiz çözüm:

Paths.get("C:/aaa/bbb/ccc/ddd/test.java").getParent().getFileName();

Sonuç şöyle olacaktır:

C:/aaa/bbb/ccc/ddd

5

Yalnızca String yolunuz varsa ve yeni File nesnesi oluşturmak istemiyorsanız, aşağıdaki gibi bir şey kullanabilirsiniz:

public static String getParentDirPath(String fileOrDirPath) {
    boolean endsWithSlash = fileOrDirPath.endsWith(File.separator);
    return fileOrDirPath.substring(0, fileOrDirPath.lastIndexOf(File.separatorChar, 
            endsWithSlash ? fileOrDirPath.length() - 2 : fileOrDirPath.length() - 1));
}

4
Zaten kök konumundaysanız, bu ArrayOutOfBoundsException'ı atar - "/" -
Jnmgr

2
File file = new File("C:/aaa/bbb/ccc/ddd/test.java");
File curentPath = new File(file.getParent());
//get current path "C:/aaa/bbb/ccc/ddd/"
String currentFolder= currentPath.getName().toString();
//get name of file to string "ddd"

"ddd" klasörünü başka bir yolla eklemeniz gerekiyorsa;

String currentFolder= "/" + currentPath.getName().toString();

1

Java 7'den Path kullanmayı tercih ederim. Sadece şunlara yol açmanız gerekir:

Path dddDirectoryPath = Paths.get("C:/aaa/bbb/ccc/ddd/test.java");

ve bazı alma yöntemi oluşturun:

public String getLastDirectoryName(Path directoryPath) {
   int nameCount = directoryPath.getNameCount();
   return directoryPath.getName(nameCount - 1);
}

0

Groovy'de:

FileDizeyi harika bir şekilde ayrıştırmak için bir örnek oluşturmaya gerek yoktur . Aşağıdaki şekilde yapılabilir:

String path = "C:/aaa/bbb/ccc/ddd/test.java"
path.split('/')[-2]  // this will return ddd

Bölünme, diziyi yaratacak [C:, aaa, bbb, ccc, ddd, test.java]ve dizin -2, son olandan önceki girişi işaret edecek, bu durumdaddd


0
    //get the parentfolder name
    File file = new File( System.getProperty("user.dir") + "/.");
    String parentPath = file.getParentFile().getName();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.