
yapp
User
Oct 4, 2001, 2:16 AM
Post #9 of 13
(1173 views)
|
Here is my guess. to be onest, your code had some strange lines in it. You can't write to a file when you've just opened it. That overwrites the data. Also very strange is your "file copying" procedure. (if that's wat you wanted to do). Please open a file once, and keep it open. Opening a file for every write and then closing it doesn't do you any good. Other scripts get the opportunity to open the file. Both read/writes to the same file will result in some strange file (mixed ascii's, or corruped files). It even get's worse when the file isn't locked.
# -w is very remommented at the #! line use strict; # Explicit declarations use CGI qw(:cgi); use CGI::Carp qw(fatalsToBrowser); use Fcntl qw(:DEFAULT :flock); sub completeorder_html { # Get parameters using CGI module my $ID = param('id'); # Save an array with new data. # you can't write to a file when you still need # to read from it. my @NewCounts; # Open and lock (LOCK_SH for read, LOCK_EX for write mostly) # The O_RDWR makes the file readable and writable at the same time. # P.S. you can't write until you're done reading # That was one bug in your code. sysopen(COUNT, "$datapath/orders/completed/count.txt", O_RDWR) or die "Can't open count.txt: $!"; flock(COUNT, LOCK_SH); while(my $num = <COUNT>) { chomp $num; # remove \n my $newnum = ($num + 1); # Open the new id open(ID, "$datapath/orders/$ID.txt") or die "Can't open data file for $ID: $!"; flock(ID, LOCK_SH); # Just open the file once. We keep in in use until we're done. # Combined with the flock, nobody can edit the file while this script # is running. Otherwise someother user (running the script at the same time) # could corrupt the entire file while we were busy with it at the same time. open(CART, ">$datapath/orders/completed/$newnum.txt") or die "Can't save $newnum: $!"; flock(CART, LOCK_EX); #### The following code it don't get: there are better ways of copying a file. #### Besides, you were opening the file for each print, #### and truncating it every time you opened it. (because of the >, not >> ) # # while(my $line = <ID>) # { # chomp $line; # my ($item, $quant, $price, $num, $total) = split(/\|/, $line, 5); # print CART "$item|$quant|$price|$num|$total|\n"; # } # # It can be done with this line... pring CART <ID>; # <ID> returns an array because print can handle it. # and everything is being printed in the the new file # Close and unlock the files flock(CART, LOCK_UN); close(CART); flock(ID, LOCK_UN); close(ID); print qq|This order has been given the number $newnum for further referencing.|; push @NewCounts, "$newnum"; } seek(COUNT, 0, 0) or die "Can't rewind file: $!"; # go to the first line truncate(COUNT, 0) or die "Can't truncate file: $!"; # erase everything from the first character. # Write the new data into the file, # we're done reading from it now. print COUNT, @NewCounts; # Close the count file flock(COUNT, LOCK_UN); close(COUNT); } I hope my code can help you, since I don't know the exact context of the code in your program I can't tell you that this works literally as it has been typed.
|