2016-09-22 55 views
-1

下午好。Java检测目录

我目前正在维护,需要解析目录的应用程序。 应用程序使用File.isDirectory()来检测给定的路径是一个目录还是一个文件,然后递归地提取所有包含的文件和子目录。

这是有效的,除非目录名包含空格,所以像C:\Foo\Bar这样的路径检测到FooBar这两个目录,这是所需的行为;但如C:\F oo\Bar的路径不会:File.isDirectory()返回false(一样File.isFile())这样的路径上。
在另一方面,File.isAbsolute()回报true - 所以这是一个绝对路径,但既不是文件也不是目录,根据文件库。

有什么解决方法吗?检测给定路径是否为目录的任何替代方法?或者我注定只能在没有空格的目录下运行这个应用程序?

感谢您的关注。

编辑:文件是涉及字符串转换为一个文件回字符串并返回到一个文件在5-6方法调用(不是我的代码)一个相当曲折的过程中产生的。 无论如何,我认为我找到了问题的根源。我会解决它。

我应该删除这个问题吗?我不认为它对未来的用户非常有用。今天

+2

请张贴一些代码 - 你如何创建'File'对象? – OldCurmudgeon

+1

它与空格无关。 Java File类知道如何处理空格,它必须是你的代码。尝试看看你是否在某处调用修剪。 – eladyanai

+0

为了确保我能理解,您的C驱动器上有一个名为“F oo”的文件夹(名称中有一个空格)? '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终端显示路径以这种方式与空间。

也许你可以试试这个方法在Windows中。