Два файловых дескриптора для одного и того же файла в Perl - PullRequest
1 голос
/ 26 июля 2010

Возможно ли иметь 2 файловых дескриптора для одного файла?

open TXT,"+>","New" or die "Cannot Create File \n";
print TXT "Line1 \n";
open TXT1, ">>New" or die "Cannot open file";
print TXT1 "Line2 \n";

это будет работать?

Ответы [ 3 ]

3 голосов
/ 26 июля 2010

Да, это будет работать. Можно иметь несколько дескрипторов для одного и того же файла.

Но будьте осторожны, ваш первый файл находится в режиме перезаписи. TXT1 всегда будет писать в конце файла, но TXT останется в своем прежнем местоположении и перезапишет все, что там есть или нет, в зависимости от буферизации.

Если вы делаете:

print TXT "Line 1\n";
print TXT1 "Line 2\n";
print TXT "Line 3\n";
close TXT;
close TXT1;

У вас будет:

Line 1
Line 3
Line 2

но если вы это сделаете:

print TXT "Line 1\n";
print TXT1 "Line 2\n";
close TXT1; # this writes the buffer to disk
print TXT "Line 3\n";
close TXT;

У вас будет:

Line 1
Line 3

Строка 2 записывается, а затем перезаписывается строкой 3. Хотя в первом случае строка 3 находится в буфере, строка 2 записывается, поскольку файл сначала закрывается, а затем строка 3 записывается в приложении.

Итак, используйте с осторожностью!

1 голос
/ 26 июля 2010

Да, возможно открыть несколько дескрипторов для одного и того же файла, но (1) результат может быть не тем, что вы хотите (см. Ниже), и (2) вам действительно нужно это сделать или есть лучший способЧтобы решить вашу большую проблему?

Тем не менее, вот что небольшой эксперимент показал на моей машине с Windows:

Открыть один файл в режиме записи, один файл в режиме добавления :

my $file_name = 'text_write_append.txt';
open(my $fh1, ">",  $file_name) or die $!;
open(my $fh2, ">>", $file_name) or die $!;

print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";

Вторая запись в $fh1 определяет, где остановилась предыдущая запись, топает первую bar и усекает вторую.Вероятно, не то, что вы хотите.

foo
xar

Откройте оба файла в режиме добавления .

my $file_name = 'text_append_append.txt';
open(my $fh0, ">",  $file_name) or die $!; close $fh0; # Create empty file.
open(my $fh1, ">>", $file_name) or die $!;
open(my $fh2, ">>", $file_name) or die $!;

print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";

Все наши выходные данные присутствуют, но в неправильном порядке.

bar
bar
foo
x

Открытие обоих файлов в режиме добавления без буферизованного вывода .

my $file_name = 'text_append_append_flush.txt';
open(my $fh0, ">",  $file_name) or die $!; close $fh0;
open(my $fh1, ">>", $file_name) or die $!; select $fh1; $| = 1; # No buffering.
open(my $fh2, ">>", $file_name) or die $!; select $fh2; $| = 1;

print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";

Возможно, что вы ожидаете (но обратите внимание, что небуферизованная запись обычно медленнее, чем буферизованная)писать).

foo
bar
bar
x
1 голос
/ 26 июля 2010

ДА , возможно иметь несколько обработчиков файлов для одного и того же файла.Это будет работать

    use strict;
    use warning;
    my $path = 'testfile';
    open TXT,"+>",$path or die "Cannot Create File \n";
    printf TXT "Line1\n";

    open TXT1, ">>",$path or die "Cannot open file";
    printf TXT1 "Line2\n" ;
    close TXT;
    close TXT1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...