Toon posts:

[perl] ophalen bestanden uit directory

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, hopelijk kunnen jullie me helpen met het volgende probleem. Ik heb een directory met bestanden. Nu zijn er een aantal bestanden die bijvoorbeeld test.001, test.002, test.003, test.004 heten. Om het makkelijk te maken wil ik alleen test.004 automatisch laten ophalen. Heeft iemand een idee hiervoor?

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:21

Koffie

Koffiebierbrouwer

Braaimeneer

En de vraag is :?
Hoe je een bestand moet openen in Perl, of hoe je een lijst krijg van alle bestanden in een bepaalde dir :?

Wat bedoel je met ophalen?
Openen, en dan de inhoud in Perl inlezen, of het bestand copieren c.q. verplaatsen :?

Braaikamer - Smoke&BBQ


Verwijderd

Topicstarter
Okee, iets duidelijker: ik wil uit een directory x een bestand halen en kopieeren naar directory y. Dat gedeelte is uiteraard geen probleem :) Ik wil alleen 1 bestand kopieeren en dat bestand heeft een nummer als extentie (en nee, niet vooraf bekend). Gelukkig is het altijd het hoogste nummer. Nu zoek ik een manier om dat bestand te vinden met het hoogste extentie nummer (tevens de nieuwste datum qua file-datum). That's it eigenlijk.

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:21

Koffie

Koffiebierbrouwer

Braaimeneer

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$some_dir = "c:\jouwdir;

opendir(DIR,$some_dir);
chdir $some_dir;    
while($entry=readdir(DIR)) {
next if ($entry eq "." or $entry eq "..");
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks)=lstat($entry);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($mtime);
$date = sprintf("%02d-%02d-%02d %02d:%02d:%02d",$mday,$mon+1,$year+1900, $hour,$min,$sec);


if ($size!=0) {
push(@files,"$entry");
} 

#Alle files uit c:\jouwdir zitten nu in de array genaamd @files


# Sorteren van de array, het hoogste bestand is de laatste uit de array
@sorted = sort @files;
$jouw_bestand = pop @sorted;

# Of de gesorteerde array omdraaien, dan is de eerste het hoogste nummer
@reverse = reverse @sorted;
$jouw_bestand = @reverse[0];


Hier een stukje voorbeeld.
Je kunt er gemakshalve vanuit gaan, dat als de size van een item niet 0 is, dat het dan een file is.
Op deze manier heb je dus alle bestanden in een array.
Bietje vogelen met die waarden en je bent eruit.

Vervolgens kun je gaan kopieren:

code:
1
2
3
sub add_image {
$source_dir = "c:\dir1" ;
copy ("$jouw_bestand","$source_dir/$jouw_bestand");


Zoeits dus ;)

Braaikamer - Smoke&BBQ


Verwijderd

Koffie schreef op 16 oktober 2002 @ 11:04:
code:
1
2
3
sub add_image {
$source_dir = "c:\dir1" ;
copy ("$jouw_bestand","$source_dir/$jouw_bestand");


Zoeits dus ;)
Zo uit mijn hoofd kan ik mij herinneren dat copy geen standaard functie is, maar dat je daarvoor eerst File::Copy (?) moet usen. Weet het niet helemaal zeker.

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:21

Koffie

Koffiebierbrouwer

Braaimeneer

Klopt, was ik vergeten :P

Moet dus eerst
code:
1
use File::Copy

tussen idd :)

Braaikamer - Smoke&BBQ


Verwijderd

Topicstarter
Okee Koffie, dit werkt so far. Heb ik alleen nog een probleem. In de directorie zitten meerdere bestandsnamen, dus moet ik daar ook nog een filter voor verzinnen. Dat is op zich niet zo moeilijk. Met eq of ne kom je een heel eind. Alleen, als ik de bestanden test.001 t/m test.004 wil krijgen, en daarmee dus test.* zoek, lukt dat dus niet. Weet jij een oplossing?

Net met Google gezocht naar de grep functie. Werkt perfect voor mij. Hiermee haal je uit de @lines de juiste gegevens en daarmee kun je dan verder werken. Thnx voor alle moeite in ieder geval.

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 10:21

Koffie

Koffiebierbrouwer

Braaimeneer

Zonder grep

code:
1
if ($entry =~ /test./i) { push(@files,"$entry"); }

Braaikamer - Smoke&BBQ


Verwijderd

die code above is wel heeeel complex en onleesbaar, en ook nog eens veel te redundant...

/me zou dit doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;

sub findLastFile {
  my $dirname = shift;

  local *DIR;
  my @items = ();

  opendir DIR, $dirname;
  while(my $item = readdir DIR) {
    next if $item eq "." or "..";

    my $mtime = -m $item;
    my ($ext) = $item =~ m/\.(\d+)/

    push @items, [ $ext, $mtime, $item ];
  }

  # sort op extense anders modificatie tijd.
  @items = reverse ( sort { $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1] } @items );

  my $lastitem = $items[0]->[2];

  return $lastitem;
}


al was het alleen maar vanwege de leesbaarheid... :7

edit:
bijna goed de eerste keer, maar net niet helemaal ... O-)
Pagina: 1