![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
burakov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
помогите пожалуйста нужен класс, который бы читал РЕКУРСИВНО предложенный ему каталог возвращая имена файлов. как пример приведу Не рекурсивное чтение каталога Вот класс.
а вот как я получаю имя файла
вообщем то я воспользовался подсказкой ginnie http://forum.vingrad.ru/forum/topic-224296.html по поводу класса через файловый дискриптор. но вот РЕКУРСИЯ меня доконала, уже третий день сижу. нужно, чтобы работало как в выше приведенном примере, только читало каталог $workdir вместе с подкаталогами (рекурсивно) может кто уже делал? или быстро соображает... ![]() огромное спасибо. |
||||
|
|||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov,
а что если попробовать вот так (не проверял, писал прямо в форум) ..... Добавлено @ 15:19 Ps есть еще модуль DirHandle, может он поможет? Это сообщение отредактировал(а) shamber - 21.8.2008, 15:25 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, хочу обратить внимание на ошибку в Вашем классе: переменные $workdir и $dir являются общими для всех объектов Вашего класса, соответственно одновременно Вы не можете создать два независимых объекта, что неправильно. Надо переделать класс с файлового дескриптора на хэш.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
чего то у меня не отображается пример shamber' a
я вижу только burakov, а что если попробовать вот так (не проверял, писал прямо в форум) ..... Добавлено @ 15:19 Ps есть еще модуль DirHandle, может он поможет? что значат эти четыре точки ![]() |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 5 Всего: 27 |
-------------------- Died at Life.pl line 21 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Это сообщение отредактировал(а) ginnie - 21.8.2008, 16:27 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
Грубая прикидка.
З.Ы. вместо точек читать тут ![]() Добавлено @ 16:36 Хотя File::Find наверно лучше ![]() Добавлено @ 16:38 ginnie, обогнал ![]() Это сообщение отредактировал(а) shamber - 21.8.2008, 16:38 |
||||
|
|||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый shamber, предлагаю подумать на предмет
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
ginnie, полностью с Вами согласен. Но я написал, грубая прикидка. Я не писал ему код, я предложил вариант.
Спасибо, за уточнение
Это сообщение отредактировал(а) shamber - 21.8.2008, 16:57 |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Огромное спасибо за ответы.
![]() (то что я много не понял это черт с ним, главное рабочие примеры есть, буду разбираться). Но вот хотел спросить все таки по поводу объявления переменных в модуле. чем все таки лучше, если через ХЕШ это делать. ведь имя каталога в ХЕШ массиве пишется в одно место $self->{cat} = $workdir; т.е. по идее
перезапишет $self->{cat} и чем тогда это отличается, если просто все делать не через ХЕШ, а как я по старинке через переменную (ибо пока не до конца понимаю прелестей этих Хешей). Можете ПО-РУССКИ (по проще на конкретном примере) сказать почему лучше @_ писать в ХЕШ, а делать $workdir = shift; ??? понимаю, что возможно я где то чего то не дочитал ( и наверное много) раз такие вопросы задаю., но все таки .... если что не судите строго ![]() Спасибо. |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov, для каждого DirScanRecurce -> new , создается свой экземпляр $self. И Поэтому $self->{cat} не перезапишется.
my $workdir = shift; я лично так привык делать. получаем параметры при вызове метода. Это сообщение отредактировал(а) shamber - 22.8.2008, 14:30 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, отличие понять очень просто, для этого надо просто распечатать адреса $dir и $dir2, а также внутри объектов адреса Ваших переменных и все прояснится. Распечатать адреса очень просто: print ссылки выводит тип данных и адрес в памяти.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
||||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
это два разных метода передачи параметров в функцию: именованный и списочный. Если у Вас передается несколько параметров - лучше использовать списочный (он быстрее), если много, либо из списка в разных вызовах передаются некоторые различные параметры - лучше именованный. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Понял,
(т.е. можно и через my $workdir = shift; и через my %args = @_; главное, чтобы это все присутствовало в sub new (), а не в теле модуля? ) ну и пожалуйста еще один вопросик (раз уж эта неделя у меня - "НЕДЕЛЯ получения ответов" буду наглым до конца) вот код модуля который аналогичен Reader::TextFile http://forum.vingrad.ru/forum/topic-224296.html ну я его переписал, так чтобы сам его понимал до конца ![]()
только в конце самом при помощи sub delete мне созданный *.tmp надо удалить а как передать имя файла в sub delete внутри модуля??? (чтобы не вылезти в основной код) при этом не объявляя $file глобально? Спасибо. |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, еще раз хочу обратить Ваше внимание на
Надо передать имя файла не внутри модуля (класса), а внутри объекта (экземпляра класса). Лучше это делать используя в качестве основы класса массив или хэш, тогда все данные, уникальные именно для этого объекта надо помещать в этом массиве (хеше). -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
а зачем объявлять, лучше его в самом начале сохранить в хэш, а потом удалить, так надежнее если в самом конце удалять то используйте DESTROY пример показал ginnie PS может так лучше?
Это сообщение отредактировал(а) shamber - 22.8.2008, 16:04 |
||||
|
|||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
вообщем за выходные я разобрался в ответах,примерах ![]() а вот на конструкцию my $str = <$self->{file}> PERL ругается. Очевидно ему не нравится большое количество <->> вот таких вот значков а как же тогда сказать ему чтобы он читал из файла?
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, попробуйте
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
burakov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Спасибо,
я через так
попробовал - получилось, НО а все таки без дополнительного присваивания my $str = <$fh>; никак нельзя ? ибо не всегда это вот присваивание уместно. я об него споткнулся, сейчас покажу
вот например если делать open не на $self->{fh}, на $fh, то $self->{fh} остается закрытым дескриптором. Обо что я собственно и стукнулся . поэтому ж и вопрос. может както можно вывернуться и указать перлу чтобы он делал <> непосредственно из $self->{file}??? или тут ничего не поделаешь? (по моему это вопрос чисто синтаксиса написания (не понимает <->>), поскольку логика перла в строке open ($self->{fh}, $self->{file}); работает отлично) Спасибо. |
||||
|
|||||
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, не могли бы Вы объяснить, как должен изменится $self->{fh} при вызове функции open() во фрагменте
По теме: с <> по-другому нельзя (см. http://perldoc.perl.org/perlop.html, раздел I/O Operators), можно попробовать
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
burakov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
добрый день
по поводу
вот если вот так вот сделать, как в примере выше, а потом попытаться поработать с дескриптором, то получить строку из файла не удается типа get_str() ругается - ну я так понял на закрытый дискриптор или неопределенный дискриптор. а вот если сделать вот так
т.е. сделать open непосредственно на $self->{fh} то все нормально. УЖ не знаю с чем это связано... я так для себя по простому объяснил, что типа просто $fh чем то отличается от open ($fh ......) поэтому и спросил как убрать лишнее присваивание, чтобы лишний раз не путаться. Огромное спасибо за ответы. |
||||
|
|||||
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov,
обязательно надо разобраться, если хотите заниматься разработкой на Perl. Проблема с первым фрагментом в том, что сначала происходит присваивание, а затем вызов open(). В хэш попадает значение undef, а ссылка на файловый дескриптор после open() остается только в переменной $fh. Чтобы работало правильно надо присваивание делать после open().
стало понятнее? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Да стало понятнее.....
присвоить $self->{fh} после open - как то до меня сразу не дошло. --- я тему пока не закрываю, еще поразбираюсь с классом который рекурсивно сканирует каталоги, спрошу чего нибудь спасибо. |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov, вопрос только в том, зачем вам плодить переменные. почему сразу не
|
|||
|
||||
burakov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
добрый день,
все таки если не сделать
то без присвоения $self->{fh} переменной код не сработает переменная $fh нужна впоследствии, для чтение строки из файла, посколько perl не понимает синтаксиса типа.
вот ginnie посоветовал воспользоваться функцией readline(), чтобы не плодить переменные. |
||||
|
|||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
спрошу еще о сканировании каталогов. захотелось создать кнопочку "СТОП", которая бы делала DESTROY. на сканирование каталогов ну т.е. прерывала сканирование каталогов в нужный для пользователя момент. ну вообщем нарисовал я такую кнопочку приделал к ней DESTROY. но при нажатии такого вот четкого конкретного дестроя на чтение каталога не происходит. т.е. если несколько раз понажимать, подергать эту кнопочку, то в какой то момент сканирование каталогов все таки останавливается. тогда я подумал, что наверное если это вот сканирование выделить в отдельный процесс. и потом делать Kill на вот этот вот отдельный процесс (и хотя я работаю в windows Kill у меня тоже работает) то это более четко прекратит сканирование каталогов. только как сказать перлу, чтобы он запустил сканирование каталогов в отдельном процессе? fork попробовал - получается вроде как два сканирования сразу - не подходит.... как правильно реализовать мою СТОП-идею? Спасибо. |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
почитайте про треды, на форуме может они вам помогут
|
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
форуме про это дело мало
нашел вот http://nopox.wordpress.com/2007/10/06/mult...eading-in-perl/ наворочено блин с тредами этими. Ну а все таки, к черту потоки эти. Дестрой то должен закрыть дескриптор - отчего ж тогда тогда ж так неустойчиво все отрабатывает??? |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov, вы приведите ваш скрипт. Сложно сказать, что у вас там происходит. Телепатия сегодня не работает
|
|||
|
||||
burakov |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Вот код
а вот код класса, который сканирует каталог рекурсивно я воспользовался помощью ginnie
P.S. Я попробовал сделать ДЕСТРОЙ на дескриптор в своем классе (который сканирует каталог НЕ рекурсивно) - и это СРАБОТАЛО. Т.е. многопоточность мне вообщем не нужна. но вот на классе ginnie (с которым я до конца так и не сумел разобраться) ДЕСТРОЙ не работает. вот пример моего НЕ рекурсивного класса,
Спасибо |
||||||
|
|||||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
burakov, замените DESTROY на что-нибудь такое
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov,
так задавайте вопросы, где и что не понятно! Будем разбираться! Добавлено через 4 минуты и 24 секунды P.S. По проблеме с кнопкой могу предложить в функцию button_2_work() добавить warn и по логу посмотреть, в какой момент после нажатия кнопки оно отработает. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
Уважаемый ginnie, кнопка отрабатывает сразу. Проблема там в другом.
Просто массив $self после
еще содержит директории. И код продолжает возвращять имена файлов из них. И остановка происходит после отработки всех уже открытых директорий Поэтому я предложил burakov, в Destroy просто очистить массив $self и все. после этого кнопка отрабатывает сразу ![]() Это сообщение отредактировал(а) shamber - 4.9.2008, 14:32 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
shamber, спасибо за пояснения! Ваш вариант деструктора, несомненно, более правильный.
С идеологической точки зрения вызывать деструктор вручную не совсем грамотный подход, лучше остановить цикл. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
полностью с вами согласен ![]() Добавлено @ 11:50 burakov, как вариант, то о чем,как мне кажется, говорил ginnie.
Это сообщение отредактировал(а) shamber - 4.9.2008, 14:33 |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
или более компактный вариант процедуры
Это сообщение отредактировал(а) shamber - 4.9.2008, 14:39 |
|||
|
||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
Ну как всегда спасибо за ответы... про связь undef-DESTROY это вы вовремя мне рассказали... ![]() вопросик по этому поводу: если объект сделать = undef, то выполнится DESTROY который записан в классе? или же какой нибудь автоматический перловый DESTROY (например если в классе нет sub DESTROY ![]() и еще вопросик по поводу класса DirScanRecurce, все еще пытаюсь в нем разобраться...
вообщем хороше бы код всего класса прокомментировать да и все тут ![]() Спасибо. |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov, немного поясню по вызову DESTROY:
пусть в переменной $DirScanRecurce ссылка на объект класса DirScanRecurce. Если это единственная ссылка на этот объект, то при выполнении
ссылка удаляется и запускается процедура сбора мусора, в рамках которой вызывается метод DESTROY объекта, если он есть. Поэтому, можно считать процедуру сбора мусора автоматическим DESTROY, но он не заменяется методом класса, а дополняется. Если ссылок на объект больше одной, то undef одной из них не приведет к запуску сборщика мусора для объекта. По поводу return читаем perldoc -f return: "Если аргумент не задан, возвращается пустой список в списочном контексте, undef в скалярном контексте и ничего не возвращается в пустом (void) контексте."
говорит, что надо завершить цикл с меткой DH (т.е. выйти из него). После этой строчки следующей выполняется
Это сообщение отредактировал(а) ginnie - 5.9.2008, 11:54 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
burakov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Добрый день.
спасибо за ответы с кодом $DirScanRecurce более менее разобрался. вот на его основе написал такой же, только он отдает не только файлы, но и каталоги, т.е. получается полное дерево. Удобно если допустим убирать-устанавливать атрибуты у файлов-каталогов. есть только один вопрос. вот кстати код
в моем варианте $workdir, который подставляется в sub new не попадает в print "$line\n"; понятно, что достать этот $workdir нетрудно, поскольку он известный (я же знаю, чего подставляю), но все таки возможно следующее ?: чтобы сканировало рекурсивно, в new подставлялся $workdir, а первым my $line = $test -> get_line() получался бы наш главный (родительский) $workdir, который мы подставляем в new? |
|||
|
||||
ginnie |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый burakov,
если я скажу "нет", Вы поверите? ![]() комментируем строку
в конструкторе в get_line() дописываем:
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |