2011-01-29 2 views
1

Добрый день!Java. Файлы и папки. Невозможно определить тип

Я написал метод на 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".

+0

не уверен, что вы хотите достичь, но почему бы не использовать File.listFiles(), которая дает правильный файл объекты –

+0

Это часть метода, который получает все файлы в папке и ищет информацию в них. Поэтому он работает с использованием рекурсии. Вот почему мне нужно было знать какой-то файл. Но я только начинаю, и теперь я понимаю, что это очень плохой код. – ExiRe

ответ

2

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

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

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

File f = new File(normalPath, namesOfFilesDir[i]); 
+0

Большое спасибо !!! Вы абсолютно правы! – ExiRe

+0

Хорошая точка. ExR, в вашем первом 'printf()' debug statement вы печатаете значение 'pathToCurrentFile'. Но это НЕ то же самое, что значение, которое использует ваш конструктор 'new File()' в строке выше. Сделайте то, что говорит Сергей, и напечатайте фактический путь, который говорит объект File. –

1

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

Вы заметили дубликат разделителя файлов на вашем пути?

+0

Я написал 2 File.separator, потому что у меня должен быть правильный путь к файлу. Я хочу работать с ними! – ExiRe

+0

Извините, но я не понимаю, что вы имеете в виду. Я думаю, вам нужно пересмотреть свою логику - сначала проверьте, является ли ваш файл каталогом, только если это каталог, который использует метод 'list(). В любом случае вы не должны использовать два последовательных разделителя файлов. – Yoni

+0

Да, путь был неправильным. У меня было 2 имени одного файла в пути. Спасибо! Эта ошибка была девичьей пропастью без внимания. – ExiRe

1

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

1

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

В любом случае, в соответствии выход:

FileName = Readme.txt, Путь = [C: \ рабочее пространство \ Grep \ т \ Readme.txt]

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

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

+0

Да, вы правы! Я забыл об этом. И тебе спасибо! – ExiRe

+0

@ExR - добавлен образец с более простым решением (IMO) –