Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление ветви дерева каталогов 
:(
    Опции темы
diver85
Дата 20.3.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



В общем ребята такая проблема - необходимо удалить каталог со всем его содержимым.
Проблема в том, что на сервере находятся некоторые файлы с длинными именами, и их невозможно удалить.
(TotalCommander их не может прочитать/скопировать/переместить и др средства тоже)
В скрипте выдается сообщение "Can't delete directory '$dir': $!\n";
Можно ли как то обойти это и удалить файлы с длинными именами??
Или может написать скрипт для сканирования директорий и записи в log-файл тех файлов, что не может удалить (что б потом вручную их поправить)
Может как то влияет на это кодировка(UTF8, ANSI)??
Или еще возможно написать срипт который выводит большую информацию о непрочитанных файлов (запорченых), что б понять в чем проблема(возможно кроме длинного имени в файлах, проблема скрыта в чем то другом – в кодировке например)

Мой скрипт для удаления таков:
Код

#!/usr/bin/perl -w
use strict;
use File::Path;

if ( @ARGV ) {
    RemoveDir( @ARGV );
} else {
    print "\nYou must call this programm with parameters.\nSample: C:\\>perl $0 D:/dir1 C:/dir2\n\n";
    exit(0); # Завершаем выполнение программы
}

sub RemoveDir {
   while ( my $dir = shift ) {
           if ( -e $dir and -d $dir ) {
                rmtree( [ $dir ] )
                   ? print "Directory '$dir' was successfuly removed.\n"
                   : warn "Can't delete directory '$dir': $!\n";
           } else {
                print "Directory '$dir' is not exists or not directory.\n";
           }
   }
}

еще писал скрипт для вывода информации о файлах, но он чего-то не работает, на всякий случай кидаю код:
Код

use Cwd: # модуль для определения текущего рабочего каталога 
$1=1; # отключаем буферизацию ввода/вывода
sub ScanDirectory {
my ($workair) = shift;
my($startdir) = &cwd; 
ft запоминаем, откуда мы начали chdir($workdir) 
or die "Невозможно зайти а каталог $workdir:$'\n":
opendir(DIR, ".") 
or die "Невозможно открыть каталог $workdir:$!\n";
my @names = readdir(DIR);
closedir(DIR);
foreach my $name (@names){ next if ($name eq "."); next if ($name eq "..");
if (-d $name){ ft это каталог?
&ScanDirectory($name); next; } unless (&CheckFile($name)){
print &cwd."/".$name."\n"; # выводим имя
ft поврежденного файла } }
sub CheckFile<
my($name) = shift;
print STDERR "Проверяется ". &cwd."/'". 
$name. "\n"; # пытаемся получить состояние файла my @stat = stat($name);
if (!$stat[4] && '$stat[5] && !$stat[6] && !$stat[7] && l$stat[8]){ return 0;
i )
# пытаемся открыть этот файл unless (open(T,"$name")){
return 0: }
tt читаем файл по байту за один раз for (my $i=0;$i< $stat[7]:$i++){
фу $r=sys'-ead(T.$i, 1);
if ($r '= 1) { dose(T); retu--n 0 } >
close(T);
return 1: >
&ScanDirecto-y("."):


PM MAIL   Вверх
KSURi
Дата 20.3.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



А стандартные rm/rmdir не пробовал?
Код

my $dir = './test';

system($^O eq 'MSWin32' ? 'rmdir /Q /S' : 'rm -fr', $dir);



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
diver85
Дата 20.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



пробовал, неработает...
сервак стоит на NetWare, я сначала думал что-то с атрибутами доступа(атрибут - "Delete Inhibit", - "удалить нельзя"), оказалось нет, причина в чем то другом и скорее всего в длинных именах, т.к. ошибки удаления выскакивают на файлах с длинными именами.
Мне б хотяб вывести информацию о нечетамых файлах, я б тогда собрал статистику о инфе о файлах, может что то б прояснилось.
PM MAIL   Вверх
BlackLFL
Дата 20.3.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



пример имени файла можно?
и неплохо было бы увидеть все-таки лог ошибок ...

так же посмотрите такие модули как 
File::Copy::Recursive
File::Util - метод list_dir
PM WWW   Вверх
diver85
Дата 20.3.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



пример имени файла:
Приказ № 56 от 26.01.2005  О введении  Положения об участке ( площадке) сбора пром-бытовых и произв. отходов и внесении изменения в   Инструкцию о порядке сбора, учета и сдачи лома и отходов цв. и черных металлов....doc

в логе пишет:
невозможно прочитать файл или каталог. Имя файла или каталога слишком длинное

я уже знаю, что ответят - нечего так файл называть, это понятно, не я так называл.
просто если есть какая возможность его удалить, то помогите пожалуйста, если нет, то так руководству и скажу - что нечего было так называть свои приказы...уже 2 день с этим ...

p/s
мне зачем его удалять то:
-когда происходит резервное копирование, с прошлой недели backup нужно удалить, и записать на его место новый, а получается, что если удалить дерево каталогов не может, новый backup копирует внутрь, приходится править вручную, что не выход, нужно что бы все автоматически работало (оно и работало до поры до времени...)


PM MAIL   Вверх
BlackLFL
Дата 20.3.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 15.9.2005
Где: Москва

Репутация: 8
Всего: 12



Цитата

в логе пишет:
невозможно прочитать файл или каталог. Имя файла или каталога слишком длинное

2diver85, такой ошибки я не знаю! приводите оригинал.

Вы посмотрели модули, которые я посоветовал?
PM WWW   Вверх
nitr
Дата 20.3.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



diver85, достаточно недавно приводились примеры работы с каталогами/файлами с длин.именами в Windows. Воспользуйтесь поиском, если что, обращайтесь еще раз.


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0697 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.