2016-09-22 3 views
-1

Добрый день.Каталоги обнаружения Java

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

Это работает, если имя каталога не содержит пробелы, поэтому путь, как C:\Foo\Bar обнаруживает как Foo и Bar как каталоги, что желаемое поведение; но путь, такой как C:\F oo\Bar, не имеет: File.isDirectory() возвращает false (как и File.isFile()) на таком пути.
С другой стороны, File.isAbsolute() возвращает true - так что это абсолютный путь, но ни файл, ни каталог, согласно файловой библиотеке.

Есть ли обходной путь? Любые альтернативы для определения того, является ли данный путь каталогом? Или я обречен на запуск этого приложения только в каталогах без пробелов в них?

Благодарим за внимание.

Редактировать: файл создается из-за довольно извилистого процесса, включающего преобразование строки в файл обратно в строку и обратно в файл через 5-6 вызовов метода (а не мой код). В любом случае, я считаю, что корень проблемы. Я исправлю это.

Должен ли я удалить этот вопрос? Я не вижу, чтобы это было очень полезно для будущих пользователей.

+2

Пожалуйста, разместите код - как вы создаете объект 'File'? – OldCurmudgeon

+1

Это не имеет ничего общего с пробелами. Класс Java File знает, как бороться с пробелами, это должен быть ваш код. Попытайтесь посмотреть, хотите ли вы что-то подделать. – eladyanai

+0

Просто, чтобы понять, у вас есть папка с именем «F oo» (с пробелом в названии) на вашем диске C? Что говорит 'File.exists()'? –

ответ

-1

Сегодня я написал код, который заполняет JTable файлами. Надеюсь, поможет.

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.io.File; 
import java.text.SimpleDateFormat; 

import javax.swing.Icon; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.filechooser.FileSystemView; 
import javax.swing.table.DefaultTableModel; 

public class LeftPanel extends JPanel { 

private JTable table; 
private NavigationPanel backAndDriverPanel; 

private String[] columns = { "Path", "Size", "Last Modified" }; 
private File file; 
private File[] filesNames; 

private final String DIR = "C:/"; 

public LeftPanel() { 

    Dimension dimension = getPreferredSize(); 
    dimension.width = 640; 
    setPreferredSize(dimension); 
    setLayout(new BorderLayout()); 

    // CREATING COMPONENTS 
    table = new JTable(); 
    backAndDriverPanel = new NavigationPanel(); 

    table.setAutoCreateRowSorter(true); 
    table.setFocusable(false); 
    table.setRowSelectionAllowed(true); 

    JScrollPane tableScroll = new JScrollPane(table); 

    // ADDING COMPONENTS TO PANEL 
    add(tableScroll, BorderLayout.CENTER); 
    add(backAndDriverPanel, BorderLayout.PAGE_START); 

    createTableModel(); 

} 

public void createTableModel() { 

    // DATE FORMAT 
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

    file = new File(DIR); 

    filesNames = file.listFiles(); 

    DefaultTableModel model = (DefaultTableModel) table.getModel(); 
    model.setColumnIdentifiers(columns); 

    // LIST OF ROWS 
    Object[] row = new Object[3]; 
    for (int i = 0; i < filesNames.length; i++) { 

    row[0] = filesNames[i].getAbsolutePath(); 
    row[1] = filesNames[i].length(); 

    // CONVERTING FROM MILISECONDS TO NORMAL DATE 
    row[2] = sdf.format(filesNames[i].lastModified()); 

    model.addRow(row); 
    } 

    // SETING EDITABLE TO FALSE 
    for (int i = 0; i < table.getColumnCount(); i++) { 

    Class<?> col_clas = table.getColumnClass(i); 
    table.setDefaultEditor(col_clas, null); 
    } 

} 
} 
+0

Я не вижу, как это решает проблему правильной идентификации каталога с пробелом в имени в качестве каталога. –

1

Я попробовал его в Max os. все нормально

File dir = new File("/Users/JinQi/Downloads/is space/foo"); 
File dir1 = new File("/Users/JinQi/Downloads/is\\ space/foo"); 
System.out.println(dir.isDirectory()); // true 
System.out.println(dir1.isDirectory()); // false 

почему я попытался is\\ space, что я обнаружил, что UNIX терминала шоу путь с пространством таким образом.

Возможно, вы можете попробовать этот путь в окнах.

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