Джава. Файлы и папки. Не могу определить тип - PullRequest
1 голос
/ 29 января 2011

Добрый день!

Я написал метод на Java, который должен искать файлы в папках и выполнять с ними некоторые операции.

Так что проблема в том, что когда я пытаюсь проверить, что у меня есть (файл или каталог), я ничего не получаю в обоих случаях! Но, как я вижу, пути выглядят правильно.

Как я могу решить эту проблему?

Вот код:

public void searchInDir(){

    File inputFile = new File( this.fileName );         
    String[] namesOfFilesDir = inputFile.list();  

    for ( int i = 0; i < namesOfFilesDir.length; i++ )
    {   
        String normalPath = this.getNormalPath(inputFile.getCanonicalPath()); //C:\User -> C:\\User
        // Two separators for correcting path to file
        String pathToCurrentFile = normalPath + File.separator + File.separator + namesOfFilesDir[i];

        File f = new File( pathToCurrentFile, namesOfFilesDir[i] );


        System.out.printf("FileName=%s, Path=[%s]\n", namesOfFilesDir[i], pathToCurrentFile);
        System.out.println(f.isDirectory());//False
        System.out.println(f.isFile());//False too          
        //Some other code           
    }
}

Например, this.fileName содержит путь к папке (и эта папка состоит из одной папки и 2 файлов).

Я получил следующее:

    FileName=Readme.txt, Path=[C:\\workspace\\Grep\\t\\Readme.txt]
    false
    false
    FileName=t2, Path=[C:\\workspace\\Grep\\t\\t2]
    false
    false
    FileName=test.txt, Path=[C:\\workspace\\Grep\\t\\test.txt]
    false
    false

Ok. Программа говорит, что.

Позволяет напечатать следующий код в качестве примера.

File f = new File("C:\\workspace\\Grep\\t\\Readme.txt");
System.out.println(f.isFile());

Программа выведет «True».

Ответы [ 4 ]

2 голосов
/ 29 января 2011

Эта часть не имеет смысла:

    String pathToCurrentFile = normalPath + File.separator + File.separator + namesOfFilesDir[i];
    File f = new File( pathToCurrentFile, namesOfFilesDir[i] );

Даже если мы пока забываем о двойном разделителе, нет смысла сначала создавать имя файла, добавляя namesOfFilesDir[i], а затем создаватьFile () объект с использованием конструктора с двумя аргументами, который в основном добавляет namesOfFilesDir[i] еще раз.Попробуйте напечатать f.getAbsolutePath (), и вы поймете, что я имею в виду.Наверное, должно было быть что-то вроде:

    File f = new File( normalPath, namesOfFilesDir[i] );
1 голос
/ 29 января 2011

1-й System.out.println вводит в заблуждение!
Было бы лучше вывести путь f.

В любом случае, согласно выводу:

FileName = Readme.txt, путь = [C: \ workspace \ Grep \ t \ Readme.txt]

f будет C:\workspace\Grep\t\Readme.txt\Readme.txt, то есть namesOfFilesDir[i] добавляется дважды!

Было бы проще / лучше работать только с экземплярами File напрямую:

    File inputFile = new File(this.fileName); 
    File[] files = inputFile.listFiles();
    for (File f : files) {
        System.out.printf("FileName=%s, Parent=[%s]\n", f.getName(), f.getParent());
        System.out.println(f.isDirectory());
        System.out.println(f.isFile());         
        //Some other code
    }
1 голос
/ 29 января 2011

Я думаю, что, возможно, ваши пути не верны. И isFile(), и isDirectory() возвращают значение true, только если файл / каталог действительно существует. Вы пытались вызвать exists() для файла? Кроме того, я с подозрением отношусь к тому, что делает ваш getNormalPath() метод - я думаю, что он может искажать имена файлов.

1 голос
/ 29 января 2011

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

Заметили ли вы двойной разделитель файлов на вашем пути?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...