Thema Dateien Mittwoch, 10.12.2008, 09:28:36 Uhr
truncate - Dateigröße verändern in Perl Der Befehl truncate, der laut Dokumentation nicht auf allen Systemen vorhanden ist (bei mir jedoch unter Windows XP, Vista und Linux schon), kann dazu verwendet werden, eine Dateigröße nachträglich zu ändern.
Beispiel:
open (my $out,'>','test.txt'); print $out "123456789"; truncate($out,4); close $out;
|
Weiterlesen...
Donnerstag, 3.1.2008, 08:13:26 Uhr
Fortgeschrittenes beschreiben von Dateien - einzelne Zeilen finden und ändern bzw. löschen Nun, ich gebs ja zu, oft bin ich ja als Grundlagenforscher unterwegs. Diesmal geht es darum, Dateien möglichst so zu beschreiben, so daß beim Einlesen bestimmte Zeilen besonders schnell wiedergefunden werden können.
Na gut, ein Beispiel Ich habe 1000 fortlaufende Rechnungsnummern, dazu jeweils 1000 Brief-Texte, die ich in einer Datei speichern will. Später will ich möglichst effektiv auf jeweils beliebige Rechnungsnummern plus Brief-Texte zugreifen. Weiterlesen...
Montag, 3.9.2007, 14:58:30 Uhr
Bestimmte Anzahl von Zeilen aus Datei einlesen - Probleme eines Lesers
Ich habe heute per Email von den Problemen eines Lesers erfahren, der zehn Zeilen aus einer Datei einlesen will, was aber irgentwie nicht hinhaut.
Er hat mir auch gleich seinen Code mitgeschickt, der folgendermaßen aussieht:
Weiterlesen...
Mittwoch, 22.8.2007, 10:37:45 Uhr
Alle Dateien eines Verzeichnisses löschen - Aber bitte mit Ausnahmen!
Wie so oft stand ich mal wieder vor dem Problem, bestimmte Ordner zu leeren, aber nicht komplett, da einige Dateien unberührt bleiben sollten.
Da ich schon öfters das Problem hatte, hab ich nun endlich mal ne vernünftige Subroutine geschrieben, die das Problem ein für allemal erledigt.
Weiterlesen...
Freitag, 1.6.2007, 11:55:37 Uhr
Bestimmte Anzahl von Zeilen aus Datei einlesen Ein Problem beim Einlesen von Dateien kennen viele: Entweder man liest die Datei komplett in den Arbeitsspeicher ein und "verschleudert" so wertvolle Systemressourcen, oder man liest Zeilen nacheinander ein und hat dann das Problem, daß die jeweils nachfolgende zeile nicht da ist, wenn man sie braucht.
Ein Beispiel für das komplette Einlesen von Dateien
Weiterlesen...
Freitag, 11.5.2007, 12:18:57 Uhr
utime - Zeitstempel von Dateien oder Verzeichnissen ändern utime setzt den Zeitstempel für Dateien oder Verzeichnissen neu. Zeitstempel bedeutet dabei: Die Zeit des letzten Lese- und Schreibzugriffes.
Syntax $ergebnis=utime (Lesezeitneu,Schreibzeitneu,@Dateien); oder $ergebnis=utime (Lesezeitneu,Schreibzeitneu,$Datei); Weiterlesen...
Freitag, 27.4.2007, 11:29:17 Uhr
Speedtest File::Find Wie ich hier ja schon berichtet habe, schien mit das Modul File::Find zu der Zeit etwas unflexibel.Grund dafür war die Tatsache, daß ich keine Dateiendungen übergeben konnte bzw. nicht festlegen konnte, wie viele Ebenen durchsucht werden sollen bzw. nur die aktuelle Ebene oder inklusive Unterebene.
Dies ist zwar natürlich Möglich, aber leider nur per Umweg. Der Aufruf von File::Find erfolgt ja per Weiterlesen...
Donnerstag, 26.4.2007, 11:27:33 Uhr
Identische Dateien finden - Der Holzweg
Zum ursprünglichen Beitrag Hier also der Code, der mich nicht weiter brachte.
use Digest::MD5 qw(md5); use strict;
my %files=(); my %dateien; my @nulllength=(); my @dateisize=(); my @dateien=get_all_files('c:/htdocs/',1,'.shtml');
print "Es wurden ".@dateien." Dateien gefunden\n";
## Dateilänge holen und merken foreach (@dateien){ open (my $IN,'<'.$_); my $dateilaenge=(stat($_))[7];
binmode ($IN); read ($IN,my $key,100); close $IN;
my $size="$dateilaenge|$key";
# Ist Hash-Element der Dateigröße schon vorhanden??? # Wenn nicht, dann Array anlegen, erster Wert ist die Dateigröße # Übrigens : Hier kann man die Verwendung eines Hashes mit (aus?) Arrays sehen push (@{$dateien{$size}},"$size") if (!defined @{$dateien{$size}}); push (@{$dateien{$size}},$_); }
# Ab hir steht in [filename,filename,filename] # jede Datei, aufgetielt nach Dateigroessen
@dateien=(); foreach (keys %dateien){ my @dats=@{$dateien{$_}}; # wenigstens 2 Filenamen müssen da sein, also @dats >= 3, da erster Eintrag die Dateilaenge next if @dats < 3;
&get_checksum(@dats); } %dateien=();
print qq~Dateien mit Nulllaenge:\n~; print join("\n",@nulllength);
print qq~\n\nIdentische Dateien:\n~;
foreach (keys %files){ print "$files{$_}\n\n" if (split('\n',$files{$_}) >1); }
exit;
################### # Parameter # Startdir ohne abschließendes /, aktuelles Verzeichnis = . # Unterverzeichnisse durchsuchen? 1: ja, 0: nein # Dateitypen in form .txt.htm.html , also direkt hintereinander, aber nur wenn nötig # ansonsten wird alles gezeigt ############################################# sub get_all_files{ my $startdir=shift; my $include_subdirs=shift; my $endings=shift; my %endings=(); $endings=~ s/\s//g; my @endings=split('\.',$endings); shift @endings;
my $endings=0; $startdir=~ s/\/$//;
if (@endings != 0){ $endings=1; # wenn Endungen angegeben foreach (@endings){ $endings{$_}=1; } } @endings=();
my @dateien=(); push (my @all_directories,$startdir);
foreach my $akdir(@all_directories){ local *in; opendir (in,$akdir); my @all=readdir(in); closedir in;
foreach my $akdatei (@all){ next if ($akdatei eq '..' || $akdatei eq '.'); if (-d "$akdir/$akdatei") { if ($include_subdirs == 1){ push (@all_directories,"$akdir/$akdatei"); next; } } else { if ($endings==0){ push (@dateien,"$akdir/$akdatei"); } else { my @endung=split('\.',$akdatei); my $endung=$endung[-1]; if ($endings{$endung} == 1){ push (@dateien,"$akdir/$akdatei"); } } } } } return @dateien; }
###################### # generiert Checksumme einer Datei ############################################# sub get_checksum{ my ($dateiname,$dateilaenge); my %tempfiles=(); # temporäre Files my $data='';
$dateilaenge=shift; ($dateilaenge,my $dummy)=split('\|',$dateilaenge);
return if $dateilaenge > 64000000;
if ($dateilaenge == 0){ # Wenn Dateilaenge = 0, dann gleich alles ins Array und zurück push (@nulllength,@_); return; }
my $firsthundret='';
foreach $dateiname (@_){
open (my $IN,'<'.$dateiname); binmode($IN);
my $checksum = Digest::MD5->new->addfile(*$IN)->digest; close $IN;
$files{$checksum}.="$dateiname\n"; } }
|
Mittwoch, 25.4.2007, 11:15:37 Uhr
Identische Dateien auf dem Computer finden mit Perl Vor kurzem stand ich vor dem Problem, daß auf einem von mir betreuten Webserver der Speicherplatz aufgebraucht war. Nach etwas herumsuchen stellte ich dann fest, daß es daran lag, daß viel Speicherplatz verschleudert wurde, weil viele identische Dateien mehrmals vorhanden waren.
Was lag also näher, als ein kleines Perl-Programm zu schreiben, das doppelte (identische) Dateien findet?
Weiterlesen...
Mittwoch, 18.4.2007, 00:01:12 Uhr
stat - Eigenschaften von Dateien ermitteln Die Funktion stat() ermittelt diverse Eigenschaften einer Datei auf einmal. Viele dieser Eigenchaften sind jedoch Unix-spezifisch. Manche dieser Eigenschaften lassen sich zwar auch auf anderen Plattformen erfragen, meist ist es jedoch einfacher, die Dateitestoperatoren für Dateien/Verzeichnisse zu verwenden. Die Funktion stat läßt sich im Gegensatz zu lstat nicht auf Dateirepräsentationen, sondern nur auf "Originale" von Dateien anwenden.
Syntax @Eigenschaften=stat(Datei); Weiterlesen...
|