Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проблема с file.exists() в сервлете


Автор: alexey123456 1.12.2010, 14:58
Добрый день.
Работает сервлет, создает временную директорию с именем, завязанным от сессии, например:
"run1a7d94e128f0333b0af335a99210-1291204215593".

Далее внутри этой директории появляется файл, после чего код ниже выдает рез-т false, т.е. файл не найден:

Код

File file = new File("C:\\Environment\\" + tempDir.trim() + "\\source.exe");
out.print( file.exists() );


tempDir точно равен текущей созданной директории. Если вывести строчку "C:\\Environment\\" + tempDir.trim() + "\\source.exe" на экран и вставить в проводник, файл успешно откроется (в данном случае source.exe ). Почему же files.exists() выдает false, не ясно..

Автор: dobrolub 1.12.2010, 18:58
Может файл появляется чуть позже чем исполняется этот код или файловая система, по каким-то причинам, не даёт процессу увидеть этот файл.

Выведи все файлы в директории с помощью file.list() и проверь какие файлы есть в дире на момент отработки этого кода. Также проверь атрибуты директории и source.exe 

Автор: alexey123456 1.12.2010, 20:09
Цитата(dobrolub @ 1.12.2010,  18:58)
Может файл появляется, чуть позже чем исполняется этот код, или файловая система по каким-то причинам не даёт процессу увидеть этот файл.

Выведи все файлы в директории с помощью file.list() , и проверь  какие файлы есть в дире на момент отработки этого кода. Также проверь атрибуты директории и source.exe

Да, именно так судя по всему и происходит.
Файл уже создан, far например или обычный проводник его видит, а программа - нет!
Если выдать все содержимое созданного каталога, то source.exe там не будет, но будут старые файлы, созданные ранее вместе с каталогом.

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

Добавлено @ 20:12
Кстати, может быть проблема в сервере GlassFish.
Он запускается автоматически из NetBeans, и для того, чтобы внести изменения, надо выполнить redemploy'ing всего проекта.
Хотя врятли - директории создаются вне проекта, в отдельной папке в корне C.

Автор: dobrolub 1.12.2010, 20:21
Вероятно надо пересмотреть логику работы программы с учётом того, как этот файл появляется в той директории. Ещё один вопрос, нужно ли этот файл класть в директорию для каждого юзера? Если юзеров много, то есть вероятность забить диск и существенно снизить быстродействие программы - файловые операции одни из самых медленных.

Автор: alexey123456 1.12.2010, 20:31
Цитата(dobrolub @ 1.12.2010,  20:21)
Вероятно надо пересмотреть логику работы программы с учётом того, как этот файл появляется в той директории. Ещё один вопрос, нужно ли этот файл класть в директорию для каждого юзера? Если юзеров много, то есть вероятность забить диск и существенно снизить быстродействие программы - файловые операции одни из самых медленных.

Там не совсем директории для юзверей.

Это что-то вроде одной тестирующей единицы - создается временная директория по jsession и времени, в нее кладется файл-исходник.

Затем из исходника собирается программа в exe или class файл (для явы).

И вот затем как раз проверяется наличие собранной программы (exe или class файл).

Автор: dobrolub 1.12.2010, 20:55
Цитата(alexey123456 @ 1.12.2010,  20:31)
Это что-то вроде одной тестирующей единицы - создается временная директория по jsession и времени, в нее кладется файл-исходник.

Это происходит в том-же потоке или в другом? Если в том-же, и с помощью java.lang.Process, то надо ждать пока Process завершиться с помощью waitFor()

Автор: alexey123456 2.12.2010, 13:18
Цитата(dobrolub @ 1.12.2010,  20:55)
Цитата(alexey123456 @ 1.12.2010,  20:31)
Это что-то вроде одной тестирующей единицы - создается временная директория по jsession и времени, в нее кладется файл-исходник.

Это происходит в том-же потоке или в другом? Если в том-же, и с помощью java.lang.Process, то надо ждать пока Process завершиться с помощью waitFor()

Помогло использование 
Код

process.waitFor();

Большое спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)