Что это за временные файлы, которые делает Perl?
Вопрос в том, как сделать так чтобы они не появлялись или потом сами удалялись, когда заканчиваеться работа с файлом file.pl ?
Я пишу просто какой-нибудь file.pl без всякой компиляции (пусть он например делает upload), выкладываю его с IIS И при работе с ним Perl создаёт какие-то свои файлы "CGITemp1234..", которые сами автоматически не удаляються.
Вопрос в том, как сделать так чтобы они не появлялись или потом сами удалялись, когда заканчиваеться работа с файлом file.pl ?
Найти место в коде, в котором создается временный файл, и написать команду удаления.
для общего развития
perldoc -f unlink
Найти место в коде, в котором создается временный файл, и написать команду удаления.
Человек же ясно сказал – он эти файлы не создает.
Предполагаю, что они создаются каким-нибудь используемым модулем.
Человек же ясно сказал – он эти файлы не создает.
Предполагаю, что они создаются каким-нибудь используемым модулем.
Похоже их создаёт модуль FILE.
Тогда как ему сказать, чтобы он это не делал или
как указать ему, чтобы чистил за собой?
Человек же ясно сказал – он эти файлы не создает.
Предполагаю, что они создаются каким-нибудь используемым модулем.
Кто не создает эти файлы, перловый скрипт???? :)= Тогда откуда по твоему беруться файлы ;)=.
Да неужели не из входного потока не считываются и не записываются?
И вообще, как же тогда быть с такой ситуацией, аля "я не хочу, а он работает." :)=
2 goodstas
еще раз
perldoc -f unlink
Кто не создает эти файлы, перловый скрипт???? :)= Тогда откуда по твоему беруться файлы ;)=.
Да неужели не из входного потока не считываются и не записываются?
И вообще, как же тогда быть с такой ситуацией, аля "я не хочу, а он работает." :)=
2 goodstas
еще раз
perldoc -f unlink
Эти файлы делаються из-за того что я использую модуть FILE. Вопрос как сделать , чтобы файлов не было. А для unlink я должен знать имя файла ... которого у меня нету, так как не я создаю эти файлы.
Во первых читаешь доку по File::MkTemp.
Смотришь код, ищешь где встречаются функции пакета типа
mktemp(tempXXXXXX,[dir]);
my $string = mktemp(tempXXXXXX,[dir]);
Ишешь конец работы своих подпрограмм и ставишь команду удаления.
В данном случае в переменной $string и будет название временного файла.
если мне не изменяет мой склероз
CGItemp* файлы создает модуль CGI при аплоуде файлов под виндами...
решение удалять в конце работы скрипта...
Хм...
если мне не изменяет мой склероз
CGItemp* файлы создает модуль CGI при аплоуде файлов под виндами...
решение удалять в конце работы скрипта...
Так и есть. Именно поэтому выше я спросил:
Скрипт, который "например делает аплоад" или именно тот, который делает аплоад?
Кто не создает эти файлы, перловый скрипт???? :)= Тогда откуда по твоему беруться файлы ;)=.
Да неужели не из входного потока не считываются и не записываются?
И вообще, как же тогда быть с такой ситуацией, аля "я не хочу, а он работает." :)=
Повторюсь. Человек выше сказал, что нигде в написанном им коде временных файлов он не создает. Предполагаю, что они создаются каким-нибудь используемым модулем.
Еще раз повторить? Тут обсуждается программирование, а не происходит игра в "передерись_к_словам".
Хм...
если мне не изменяет мой склероз
CGItemp* файлы создает модуль CGI при аплоуде файлов под виндами...
решение удалять в конце работы скрипта...
С этим можно как то бороться? Может есть что нибудь, чтобы он их сам автоматом удалял?
А вчем проблемма в конце работы удалять файлы по маске?
Повторюсь. Человек выше сказал, что нигде в написанном им коде временных файлов он не создает. Предполагаю, что они создаются каким-нибудь используемым модулем.
Еще раз повторить?
Подход в разработке, я поработал, и пусть кто нить когда нить за мной уберет, имеет право на жизнь???
Ладно об этом ниже.
Тут обсуждается программирование, а не происходит игра в "передерись_к_словам".
Меня пытаются жизни научить? ;)= Гм, посмотрим что дальше будет.
2 Alone
Сомнения у меня по поводу CGI.pm (imho Lincoln D. Stein - неприрекаемый авторитет, так что на провакации не поддаюсь)
Нашел я в коде место где и создаются временные файла аля CGItempXXX и пару строк ниже переопределен DESTROY и в нем как раз и происходит подчистка ранее созданного файла)
Это первое
Второе читаем доку
=cut
the name returned is always the name of the file on the user's machine, and is unrelated to the name of the temporary file that CGI.pm creates during upload spooling (see below).
=cut
То есть следует вывод, что как и предполагалось, при использовании метода upload() временные файлы создаются всегда, независимо от оси.
Едем дальше.
Если модуль такой платформенно-независимый, то наверняка у кого нить из людей была подобная проблема. А проблемы, как известно, пишутся вот здесь http://rt.cpan.org/NoAuth/Bugs.html?Dist=CGI.pm&ShowAll=1 а теперь ткните пальцем на подобную у кого возникли такие беды.
2 goodstas
Запости здесь свой скрипт, или отошли на [email]GermanS@russiajournal.com[/email]. А то полемика будет продолжаться.
ReDrum и 2NetFly выясняйте отношения в привате пожалуйста(надеюсь Joker поддержит) или создайте тему в гостевой... топик тонет во флуде...
ReDrum
просто приведи пример как ты аплоудиш файлы и версию CGI.pm
и скажи "Я в WINDOWS заливаю файлы и никаких временных файлов нигде(это важно, они могут лежать и temp-папках) их нет... LOLы блин :( "...
И все(ну про лолов можно убрать :) ), станет почти наверняка понятно где проблемма(модуль древний, руки из... и т.д.)
покаже это все чистый флуд
P.S.Если в yandex.ru или google.com набрать CGITemp то можно много интересного найти :)
Запости здесь свой скрипт, или отошли на [email]GermanS@russiajournal.com[/email]. А то полемика будет продолжаться. [/QUOTE]
Код Upload :
use CGI qw( :standard );
use File::Basename;
use warnings;
use strict;
my $query = new CGI;
my $upfile = $query->param("upfile");
my $path = $query->param("path");
my $abspath = $query->param("abs_path");
my $goto = $query->param("redirect");
my $fileName = basename( $query->param("upfile") );
my @array = split(/[.]/,$fileName);
my $localfile = "$path$array[$#array]";
my $jpeg = "jpeg";
my $jpg = "jpg" ;
my $bmp = "bmp";
my $gif ="gif";
if($array[$#array] eq "jpg" || $array[$#array] eq "gif" || $array[$#array] eq "jpeg"|| $array[$#array] eq "bmp")
{
if(-e "$path$jpg")
{
unlink("$abspath$jpg");
}
elsif(-e "$path$jpeg")
{
unlink("$abspath$jpeg");
}
elsif(-e "$path$bmp")
{
unlink("$abspath$bmp");
}
elsif(-e "$path$gif")
{
unlink("$abspath$gif");
}
if(open(UPLOADFILE, ">$localfile"))
{
binmode UPLOADFILE;
while (my $bytesread = read($upfile, my $buffer, 1024))
{
print UPLOADFILE $buffer;
}
close (UPLOADFILE);
print redirect($goto);
}
else
{
print redirect("$goto&Error=open");
exit();
}
}
else
{
print redirect("$goto&Error=ext");
exit();
}
ReDrum
просто приведи пример как ты аплоудиш файлы и версию CGI.pm
и скажи "Я в WINDOWS заливаю файлы и никаких временных файлов нигде(это важно, они могут лежать и temp-папках) их нет... LOLы блин :( "...
OS NT4. SP5.0
perl v5.6.1 built for MSWin32-x86-multi-thread
$CGI::VERSION='2.752'
IIS 4.0
use strict;
use vars qw/$query/;
&main();
sub main {
use CGI;
$query = CGI->new();
print $query->header(-type=>'text/html');
print $query->start_html(-title=>'Upload Test');
&upload() if ($query->param('file'));
&upl_form();
print $query->end_html();
}
sub upl_form {
$query->start_multipart_form(-method=>'post', -action=>$query->url(-relative=>1)),
$query->filefield(-name=>'file', -default=>'starting value', -size=>50, -maxlength=>80),
$query->submit(),
$query->end_form();
}
sub upload {
my $file = $query->param('file');
open (FILE, "> MyTest.gif") || die "Can't open file: $!";
binmode (FILE);
my $buffer;
while (read ($file, $buffer, 1024)) {
print FILE $buffer;
}
close (FILE) || die "Can't close file: $!";
}
Работа:
Нажмите кнопку browse,
Выберите gif файл,
Нажмите кнопку Ок, затем Submit
Результат:
Картинка запишется в файл MyTest.gif в директории в которую вы определили в переменной $filename.
Нажмите F5, в появившемся окне нажмите Retry.
Попытайтесь найти файлы типа CGITemp.
Мне этого не удалось
ЗЫ. Писал на коленке, без лишних условий и проверок.
P.S.Если в yandex.ru или google.com набрать CGITemp то можно много интересного найти :)
Мне не интересно искать, тем более что проверил эту заморочку.
Мне не интересно искать, тем более что проверил эту заморочку.
И всё таки что же не так я делаю?
Мне интересно понять, что мне нужно исправить,
а не копировать просто код.
А смотреть там всего 10 строчек, да и не думаю, что бы там было бы что-то сложное, так как Perl-ом до этого ни разу не пользовался...
Так что не думаю, что это сложная задача.
Я слава Богу не модератор, но хотелбы попросить
ReDrum и 2NetFly выясняйте отношения в привате пожалуйста(надеюсь Joker поддержит) или создайте тему в гостевой... топик тонет во флуде...
Тут отношения выяснять никто не пытается. Пытаюсь объяснить человеку, который никогда не сталкивался с вышеописанной проблемой, что она, не смотря на то, что он с ней не сталкивался, существует.
ReDrum, жизни тебя никто не учит. Сам учись. Человек выше привел код. Процитируй мне строку, где он создает временный файл (твое утверждения) и я с радость признаю, чтоб был не прав.
Кстати, топик тонет не во флуде, а в флейме ;)
{
my $dir = shift;
opendir (DIR, $dir);
/^CGITemp/i && unlink $dir . $_ foreach readdir(DIR);
closedir DIR;
}
#Удаляет все временные файлы из указанной папки
rm_cgitmp('/usr/home/user1/cgi-bin/');
sub rm_cgitmp
{
my $dir = shift;
opendir (DIR, $dir);
/^CGITemp/i && unlink $dir . $_ foreach readdir(DIR);
closedir DIR;
}
#Удаляет все временные файлы из указанной папки
rm_cgitmp('/usr/home/user1/cgi-bin/');
Не удаляет, имя директории я передаю полностью физичиский адрес - это из file.asp я передаю
Server.MapPath(".").
И вместо CGITemp только CGItemp :))
Показываю всё вместе :
use CGI qw( :standard );
use File::Basename;
use warnings;
use strict;
my $query = new CGI;
my $upfile = $query->param("upfile");
my $path = $query->param("path");
my $dir = $query->param("dir");
my $abspath = $query->param("abs_path");
my $goto = $query->param("redirect");
my $fileName = basename( $query->param("upfile") );
my @array = split(/[.]/,$fileName);
my $localfile = "$path$array[$#array]";
my $jpeg = "jpeg";
my $jpg = "jpg" ;
my $bmp = "bmp";
my $gif ="gif";
if($array[$#array] eq "jpg" || $array[$#array] eq "gif" || $array[$#array] eq "jpeg"|| $array[$#array] eq "bmp")
{
if(-e "$path$jpg")
{
unlink("$abspath$jpg");
}
elsif(-e "$path$jpeg")
{
unlink("$abspath$jpeg");
}
elsif(-e "$path$bmp")
{
unlink("$abspath$bmp");
}
elsif(-e "$path$gif")
{
unlink("$abspath$gif");
}
if(open(UPLOADFILE, ">$localfile"))
{
binmode UPLOADFILE;
while (my $bytesread = read($upfile, my $buffer, 1024))
{
print UPLOADFILE $buffer;
}
close (UPLOADFILE);
opendir (DIR, $dir);
/^CGItemp/i && unlink $dir . $_ foreach readdir(DIR);
closedir DIR;
print redirect($goto);
}
else
{
print redirect("$goto&Error=open");
exit();
}
}
else
{
print redirect("$goto&Error=ext");
exit();
}:roll: :roll: :roll: :roll: :) :???: :@@@:
Скорее всего, ты указываешь неверный путь. Если хочется проверить: создай пару файлов в директории и жестко пропиши ее (директорию) в скрипте.
+use vars qw/$query/; # Добавить это
my $query = CGI->new();
$query = CGI->new(); # Убрать my
Короче вот решение проблемы
$query = CGI->new(); # Убрать my
Это решений (с отсутствием my) приводит к необходимости отказаться от стрикта. А для больших проектов это неприемлемо ;)
или может а доку меня носом ткнешь? :))))
use vars qw/$query/; - это само собой разумеется, тем более в примере, приведенному алону, именно так и написано.
тем более в примере, приведенному алону, именно так и написано.
Теперь вижу. До этого на код никакого внимания не обратил.
Так как вы оба в танке, на досуге загляните в
perldoc Data::Dumper
Так как вы оба в танке
Я считал тебя достаточно взрослым и достаточно неглупым человеком, который в конференции о программировании не переходит на личности. Я ошибался. Дискуссия закончена.