2016-09-22 13 views
-1

おはようございます。Java検出ディレクトリ

現在、私はディレクトリを解析する必要があるアプリケーションを管理しています。 アプリケーションはFile.isDirectory()を使用して、指定されたパスがディレクトリかファイルかを検出し、含まれているすべてのファイルとサブディレクトリを再帰的に取り出します。

ディレクトリ名にスペースが含まれていない場合、C:\Foo\Barのようなパスでは、FooBarの両方がディレクトリとして検出されます。 C:\F oo\Barのようなパスはありません。File.isDirectory()は、このようなパス上でfalseFile.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で試しました。私はis\\ spaceを試してみました、なぜすべてが

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 

大丈夫です、私はこのようにスペースでそのUNIXターミナルショーパスを発見したということです。

多分あなたは窓でこのように試すことができます。

関連する問題