【问题标题】:How to get just the parent directory name of a specific file如何仅获取特定文件的父目录名称
【发布时间】:2012-01-02 01:55:58
【问题描述】:

如何从test.java所在的路径名中获取ddd

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

【问题讨论】:

  • 这是一个通用文件,还是您试图获取源文件的父目录?如果是后者,我不确定您是否了解 Java 编译。在运行时,test.java 可能甚至不会存在于运行程序的计算机上。运行的是编译后的.class 文件。所以这只有在你知道ddd 的位置时才有效,在这种情况下,以编程方式找到它是没有意义的;只需硬编码即可。

标签: java groovy java-io


【解决方案1】:

使用File's getParentFile() methodString.lastIndexOf() 检索只是直接父目录。

马克的评论是比lastIndexOf()更好的解决方案:

file.getParentFile().getName();

这些解决方案仅在文件具有父文件时才有效(例如,通过采用父 File 的文件构造函数之一创建)。当getParentFile() 为空时,您需要使用lastIndexOf,或使用Apache Commons' FileNameUtils.getFullPath() 之类的东西:

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

有几种变体可以保留/删除前缀和尾随分隔符。您可以使用相同的 FilenameUtils 类从结果中获取名称,使用 lastIndexOf 等。

【讨论】:

  • 你不需要lastIndexOf,只需使用file.getParentFile().getName()
  • 以防万一。如果它返回null(如果您使用相对路径创建了File 实例) - 请尝试file.getAbsoluteFile().getParentFile().getName()
  • @MarkPeters 这仅在使用父文件创建文件时才有效,但我猜这种情况相对较少。
  • stackoverflow.com/users/915663/nidu 它的作品,谢谢
【解决方案2】:
File f = new File("C:/aaa/bbb/ccc/ddd/test.java");
System.out.println(f.getParentFile().getName())

f.getParentFile() 可以为空,所以你应该检查它。

【讨论】:

  • 只是为了确定,输出如下:C:/aaa/bbb/ccc/ddd
【解决方案3】:

在下面使用,

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

【讨论】:

  • 值得指出的是,这个方法应该有一个父集,即使底层文件没有。
【解决方案4】:

如果你只有字符串路径并且不想创建新的文件对象,你可以使用类似的东西:

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

【讨论】:

  • 如果您已经在根位置,则会抛出 ArrayOutOfBoundsException -"/"-
【解决方案5】:
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”;

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

【讨论】:

    【解决方案6】:

    从 java 7 开始,我更喜欢使用 Path。您只需要将路径放入:

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

    并创建一些 get 方法:

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

    【讨论】:

      【解决方案7】:

      从 Java 7 开始,您有了新的 Paths api。现代和最干净的解决方案是:

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

      结果是:

      C:/aaa/bbb/ccc/ddd
      

      【讨论】:

        【解决方案8】:

        在 Groovy 中:

        无需创建File 实例即可在groovy 中解析字符串。可以这样做:

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

        拆分将创建数组[C:, aaa, bbb, ccc, ddd, test.java],索引-2 将指向最后一个之前的条目,在本例中为ddd

        【讨论】:

          【解决方案9】:
              //get the parentfolder name
              File file = new File( System.getProperty("user.dir") + "/.");
              String parentPath = file.getParentFile().getName();
          

          【讨论】:

            【解决方案10】:

            对于 Kotlin:

             fun getFolderName() {
                        
                        val uri: Uri
                        val cursor: Cursor?
                
                        uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
                        val projection = arrayOf(MediaStore.Audio.AudioColumns.DATA)
                        cursor = requireActivity().contentResolver.query(uri, projection, null, null, null)
                        if (cursor != null) {
                            column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.DATA)
                        }
                        
                        while (cursor!!.moveToNext()) {
                
                            absolutePathOfImage = cursor.getString(column_index_data)
                
                
                            val fileName: String = File(absolutePathOfImage).parentFile.name
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2015-01-21
              • 1970-01-01
              • 2011-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-17
              • 2010-09-06
              • 1970-01-01
              相关资源
              最近更新 更多