У меня есть каталог, содержащий ~ 5000 файлов .txt размером 2400.
Мне просто нужно одно имя файла из этого каталога; порядок не имеет значения.
Файл будет обработан и удален.
Это не рабочий каталог скриптов.
Намерение:
- чтобы открыть этот файл,
- прочитай это,
- сделать некоторые вещи,
- отсоедините его, а затем
- перейти к следующему файлу.
Моя грубая попытка не проверяет только файлы .txt, а также должна получить все ~ 5000 имен файлов только для одного имени файла. Я также, возможно, вызываю слишком много модулей?
Подпрограмма Verify_Empty
была предназначена для проверки наличия каталога и файлов в нем, но мои попытки не увенчались успехом, поэтому я ищу помощи.
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI;
use CGI ':standard';
print CGI::header();
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
###
use vars qw(@Files $TheFile $PathToFile);
my $ListFolder = CGI::param('openthisfolder');
Get_File($ListFolder);
###
sub Get_File{
$ListFolder = shift;
unless (Verify_Empty($ListFolder)) {
opendir(DIR,$ListFolder);
@Files = grep { $_ ne '.' && $_ ne '..' } readdir(DIR);
closedir(DIR);
foreach(@Files){
$TheFile = $_;
}
#### This is where I go off to process and unlink file (sub not here) ####
$PathToFile = $ListFolder.'/'.$TheFile;
OpenFileReadPrepare($PathToFile);
#### After unlinked, the OpenFileReadPrepare sub loops back to this script.
}
else {
print qq~No more files to process~;
exit;
}
exit;
}
####
sub Verify_Empty {
$ListFolder = shift;
opendir(DIR, $ListFolder) or die "Not a directory";
return scalar(grep { $_ ne "." && $_ ne ".." } readdir(DIR)) == 0;
closedir(DIR);
}
Очевидно, я очень новичок в этом. Этот метод кажется довольно «голодным»? Кажется, это слишком много, чтобы взять одно имя файла и обработать его! Руководство было бы здорово!
EDIT — Последняя попытка
my $dir = '..';
my @files = glob "$dir/*.txt";
for (0..$#files){
$files[$_] =~ s/\.txt$//;
}
my $PathAndFile =$files[0].'.txt';
print qq~$PathAndFile~;
Это «работает», но все равно получает все имена файлов. Пока ни один из приведенных здесь примеров мне не помог. Думаю, я буду жить с этим сегодня, пока не выясню это. Возможно, я вернусь и посмотрю, не придумал ли кто-нибудь что-нибудь лучше.
use vars ( ... $TheFile .. )
иforeach(@Files){ $TheFile = $_;
я предпочитаю писатьforeach my $TheFile (@Files){
. Имеет то преимущество, что дает переменной наименьшую область действия и не использует$_
. - person AdrianHHH   schedule 08.05.2013Get_File
иVerify_Empty
не нужны, так как$ListFolder
входит в область действия обоих; их первые присваивания просто перезаписывают переменную уже содержащимся в ней значением. - person AdrianHHH   schedule 08.05.2013