Schrift
[thread]10453[/thread]

Dateien ersetzen

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
theresa
 2007-09-24 16:08
#99923 #99923
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Dazu fällt mir ein, die alten Dateien zu löschen, dann die neuen zu schreiben.
Das wird aber problematisch, wenn sich die alten löschen, die neuen aber nicht schreiben lassen.
Deswegen brauche ich so etwas wie eine Transaktion, alte werden gelöscht, neue geschrieben, dann noch andere Dinge gemacht. Falls irgendwo einen Fehler auftaucht, bleibt alles so wie es am Anfang war, sprich die alten Dateien sind noch da.

Oder gibt es einen Befehl mit dem man Dateien kopiert und gleich die alten überschreibt?
bloonix
 2007-09-24 16:13
#99924 #99924
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
wie wäre es mit

Code (perl): (dl )
1
2
3
4
open my $fh, '>', $datei or do {
    warn "Datei $datei konnte nicht überschrieben werden!"
    do_something_else();
}
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-09-24 16:16
#99925 #99925
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
besser noch

Code (perl): (dl )
1
2
3
use Fcntl qw/O_WRONLY O_TRUNC/;

sysopen my $fh, $datei, O_WRONLY | O_TRUNC or die $!;

im ersten Beispiel mit open wird die Datei angelegt, falls es sie noch
nicht gibt, das möchte man gegebenfalls nicht...
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Linuxer
 2007-09-24 17:31
#99930 #99930
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Hi,

man könnte eine Datei "file.new" parallel zur bestehenden "file" erzeugen und füllen.

War das füllen erfolgreich, wird das alte "file" durch das neue "file.new" überschrieben (mv $file.new $file).

So bleibt die alte Datei erst noch erhalten, falls beim Schreiben der neuen was schiefgeht.
Das dürfte bei bloonix' Lösung nicht der Fall sein ...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
theresa
 2007-09-24 19:04
#99936 #99936
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Blöde frage, was sind denn $fh und $datei??
Mit normalen Pfadangaben klappt es bei mir nicht.
renee
 2007-09-24 19:27
#99937 #99937
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
$datei ist der Dateiname und in $fh wird der Filehandle gespeichert. Du kennst wahrscheinlich eher so etwas
Code (perl): (dl )
open(FH,$datei)...


Es ist aber aus mehreren Gründen besser, einen lexikalischen Filehandle ($fh) statt des FH zu nutzen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
theresa
 2007-09-25 13:11
#99972 #99972
User since
2007-07-17
90 Artikel
BenutzerIn
[default_avatar]
Hallo,

ok, also mit
Code (perl): (dl )
1
2
3
4
open my $fh, '>', $datei or do {
warn "Datei $datei konnte nicht überschrieben werden!"
do_something_else();
}


würde man erstmal nur eine Datei zum schreiben öffnen.

Danach müsste der Inhalt der Quelldatei zeilenweise auf sie kopiert werden, oder?

Das löst mein Problem nicht, denn wenn etwas beim Schreiben fehlschlägt, hat man am Ende eine leere $datei und das ist genau das was ich vermeiden will...

Komme im Moment ganz gut klar mit der Lösung von Linuxer, danke.




betterworld
 2007-09-25 18:00
#99974 #99974
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ich mach das auch immer so wie Linuxer, also mit umbenennen. Dazu muss man aber nicht "mv" nehmen, sondern kann auch Perls rename-Funktion nehmen (ist auch viel atomarner, weil mv je nach Implementation erst mal rumstatet und so). Um zu vermeiden, dass zwei Prozesse gleichzeitig in die Datei schreiben, bau ich in die Temporaerdatei noch die PID ein, etwa so:
Code (perl): (dl )
1
2
3
4
5
my $tmpfilename = "$filename.tmp.$$";
open my $f, '>', $tmpfilename or die "$tmpfilename: $!";
fuelle($f);
close($f) or die $!;
rename($tmpfilename, $filename) or die $!;

Dann muss man nur noch das Problem loesen, dass nach einem ungewollten Programmabbruch noch "Leichendateien" rumliegen. Das laesst sich aber auch recht leicht loesen, indem man einfach Dateien mit zu alter mtime loescht.

Ich hab mal irgendwann angefangen, was ueber dieses Problem aufzuschreiben: http://der-pepe.de/html/pitfalls.html#beware-trunc... (Das Dokument ist noch nicht so ganz fertig)
nepos
 2007-09-25 18:02
#99975 #99975
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Warum für temporäre Dateien dann nicht gleich CPAN:File::Temp benutzen?
bloonix
 2007-09-25 18:36
#99978 #99978
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
okay, meine Beispiele zielten eher darauf ab, sicherzustellen,
ob sich eine neue Datei bzw die alte überhaupt anlegen bzw
überschreiben lässt

im Fall von Plattenplatzmangel muss man sich gegebenfalls
noch andere Konstrukte ausdenken.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-09-24 16:08.