Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Удаление файла с переименованием други


Автор: n0xi0uzz 30.12.2004, 12:13
В общем, пишу форум на perl.
Структура хранения топиков такова: все топикик раздела хранятся в папке с номерами от 0 и так далее. Проблема вот в чем. Начал писать админку и при удалении топика (то есть удалении файла (unlink)) последующий вывод остальных топиков невозможен, поскольку нарушается четкая последовательность "от нуля и так далее". Поэтому требуется при удалении топика, во всех остальных топиках, номера файлов которых больше чем удаляемый, нужно переименовывать их файлы на
(новый_номер_файла)=(старый_номер_файла)-1;
Как это проще всего реализовать?

Автор: dimes 30.12.2004, 12:18
Цитата(n0xi0uzz @ 30.12.2004, 13:13)
Как это проще всего реализовать?

давай для начала разберемся почему:
Цитата(n0xi0uzz @ 30.12.2004, 13:13)
последующий вывод остальных топиков невозможен, поскольку нарушается четкая последовательность "от нуля и так далее"

Автор: chaos 30.12.2004, 13:00
а в чем проблема то?
удаляешь свой файл, потом переименовываешь n на n-1 и удаляешь n вот и все, что тут тне понятного то?

Автор: n0xi0uzz 30.12.2004, 15:44
Цитата(chaos @ 30.12.2004, 13:00)
а в чем проблема то?
удаляешь свой файл, потом переименовываешь n на n-1 и удаляешь n вот и все, что тут тне понятного то?

да проблем нет, все путем %)
я же спросил, как проще это реализовать, ведь переименовать надо каждый последующий файл после удаляемого ;)

2dimes
потому что вывод осуществляется вот таким циклом (for):
Код

$a=0; #кол-во топиков+1
while (open $b, "sects/$secn/$a.top")
{
 close $b;
 $a++;
}
for ($i=$a-1; $i>=0; $i--)
{
#код
}

и получается, что если удалить, допустим, третий фал, то цикл будет работать некорректно ;)

Автор: dimes 30.12.2004, 16:07
smile
Неслабо! Хорошо что ты сюда зашел.

while (open $b, "sects/$secn/$a.top") так не делают чтобы перебрать все файлы в каталоге

делай так:
Код

my @list_id;
opendir(DIR,"sects/".$secn) or print $!;# Обработку ошибки либо убери либо свое что то поставь
for ( grep { index($_,".top")>0 } readdir(DIR) ){
 my $_id=0+$_ || next; # Убеждаемся что файл начинается с цифры
 unshift @list_id,$_id;
}
closedir(DIR);

for ( @list_id ){
my $_id=$_;
..........  
}


Автор: n0xi0uzz 30.12.2004, 16:17
а смысл менять цикл while? он ведь в коде только для того, чтобы посчитать кол-во топиков, загнать это количество в переменную и потом использовать в цикле for для вывода топиков ;)

Автор: dimes 30.12.2004, 17:19
Так тебе ID нужно только для того чтобы зделать сортировку и все? И больше это ID нигде не участвует?
А например так:

Код

my $_dir="sects/".$secn;
opendir(DIR,$_dir);
for ( sort { $b<=>$a } grep { index($_,".top")>0 } readdir(DIR) ){
my $_file=$_dir."/".$_;

}
closedir(DIR);

Автор: n0xi0uzz 1.1.2005, 15:08
ну это все конечно хорошо, но это не решает той проблемы, которую я попросил помочь решить в начале топа - переименование файлов ;)

Автор: dimes 1.1.2005, 20:32
  • Если разбирешся что делает этот скрипт и посмотриш на описание функции rename то легко напишеш сам
  • то что ты считаеш проблеммой, не проблемма а втот считать это проблеммой и есть настоящая проблемма.

Автор: n0xi0uzz 2.1.2005, 10:13
прочитай пожалуйста начало темы ;) проблемой я это не считаю, но если бы я смог это сам написать к вам не обращался. Тем более, я попросил (цитата): "Как это проще всего реализовать?". Чуешь разницу? ;)

Автор: korob2001 2.1.2005, 23:41
Послушай совет про ID. Потому как твой форум, по такому алгоритму, будет работать слишком медленно.

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