2015-08-17 3 views
1

В моем инструменте я разрешаю пользователю выбирать конкретный файл. Позвонив getAbsolutePath() на этом файле я получаю строку, такие какПолучить часть пути к файлу из более длинного пути к файлу

C: \ папка \ папка \ папка \ набор данных \ Главная папка \ папка \ папка \ папка \ myfile.xml

Как я могу путь «MainFolder», сохраненный в новой переменной String. То, что я хочу из приведенного выше примера

C: \ папка \ папка \ папка \ набор данных \ Главная папка \

Структура всегда

Drive: \ случайный \ номер \ of \ folders \ dataset \ main_folder_name \ folder1 \ folder2 \ folder3 \ myfile.xml

Родительская папка той, которую я ищу. У ays есть имя «набор данных». Тот, который следует за этой папкой, является тем, который меня интересует.

+0

Использование java.nio.file; У 'Path' есть' .getParent() '. – fge

+0

'java.io.File' имеет' getParent() '/' getParentFile() 'тоже. –

+0

Подсказка: используйте 'getCanonicalPath()' not 'getAbsolutePath()' – Stewart

ответ

1

Я бы очень рекомендовал использовать File API, а не манипулировать строками, это изолирует вас от различий между платформами в прямом и обратном слешках или любых других различиях.

  • Keep «подходя один», пока не дойдете до корня, где getParentFile() возвращает нуль
  • , если вы найдете папку вам нужно по пути вырваться из цикла
  • следить за последний родитель, так что вы можете обратиться к 'main_folder_name' после того, как вы нашли 'набор данных'

Код

String path = "C:\\random\\number\\of\\folders\\dataset\\main_folder_name\\folder1\\folder2\\folder3\\myfile.xml"; 
File search = new File(path); 
File lastParent = search; 
while (search != null) { 
    if ("dataset".equals(search.getName())) { 
     break; 
    } 
    lastParent = search; 
    search = search.getParentFile(); 
} 
if (lastParent != null) { 
    System.out.println(lastParent.getCanonicalPath()); 
} 

Out положить

C:\random\number\of\folders\dataset\main_folder_name 
1

Используйте приведенный ниже код в своей программе. Это позволит решить ваши ожидания :)

import java.util.StringTokenizer; 

public class MainFolder { 
    public static void main(String args[]) { 
     String separator = "/"; 
     StringTokenizer st = new StringTokenizer("C:/folder/folder/folder/dataset/MainFolder/folder/folder/folder/myfile.xml",separator); 
     String mainFolderPath = ""; 
     String searchWord = "dataset"; 
     while (st.hasMoreTokens()) { 
      mainFolderPath = mainFolderPath + st.nextToken() + separator; 
      if (mainFolderPath.contains(searchWord)) { 
       mainFolderPath = mainFolderPath + st.nextToken() + separator; 
       break; 
      } 
     } 
     System.out.println(mainFolderPath); 

    } 

} 
0

URI класс имеет относительность и Подайте Touri.

String path = "C:\\folder\\folder\\folder\\dataset\\MainFolder\\folder\\folder\\folder\\myfile.xml"; 
    String base = "C:\\folder\\folder\\folder\\dataset\\MainFolder"; 
    File pathFile = new File(path); 
    File baseFile = new File(base); 
    URI pathURI = pathFile.toURI(); 
    URI baseURI = baseFile.toURI(); 

    URI relativeURI = baseURI.relativize(pathURI); 
    System.out.println(relativeURI.toString()); 
    // folder/folder/folder/myfile.xml 

    File relativeFile = new File(relativeURI.getPath()); 
    System.out.println(relativeFile.getPath()); 
    // folder\folder\folder\myfile.xml 
0

Это можно сделать, используя только метод substring() и indexOf() класса String. Кодекс:

String path = "C:\\random\\number\\of\\folders\\dataset\\main_folder_name\\folder1\\folder2\\folder3\\myfile.xml"; 
    int indexOfFirstBkSlashB4Dataset = path.indexOf("\\dataset"); 
    String sub1 = path.substring(0,indexOfFirstBkSlashB4Dataset); 
    String sub2 = "\\dataset\\"; 
    String sub3Intermediate = path.substring(indexOfFirstBkSlashB4Dataset+9,path.length()); 
    int index2 = sub3Intermediate.indexOf("\\"); 
    String sub4 = sub3Intermediate.substring(0,index2+1); 
    String output = sub1+sub2+sub4; 
    System.out.println(output); 

Выход: C: \ случайный \ номер \ из \ папки \ набор данных \ main_folder_name \

Смежные вопросы