如果你读取整个文件,content = open('Path/to/file', 'r').read()文件句柄是否保持打开状态直到脚本退出?是否有更简洁的方法来读取整个文件?
我试图删除一个文件,我有两个,一个稍微改变,所以我可以删除旧文件,并用我更改的新文件替换它.当我尝试删除该文件时,我收到错误消息"正在使用的文件",其中表示该操作无法完成,因为该文件是在Java(TM)Platform SE二进制文件中打开的.
我怎么关闭它?
有没有办法检查文件是否已在Perl中打开?我想要一个读取文件访问权限,所以不要求flock.
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
Run Code Online (Sandbox Code Playgroud) 我该怎么用__DATA__两次?
#!/usr/local/bin/perl
use warnings;
use 5.012;
while ( <DATA> ) {
print;
}
while ( <DATA> ) {
chomp if $. == 1;
print scalar reverse;
print "\n" if eof;
}
Run Code Online (Sandbox Code Playgroud)
__DATA__
one
two
three
four
five
six
Run Code Online (Sandbox Code Playgroud) 这个问题不是关于如何使用File #close或File#open block语法自动关闭文件.这是一个关于Ruby在运行时存储其打开文件描述符列表的问题.
如果您的程序具有开放描述符,但您无权访问相关的文件或IO对象,那么如何找到对当前打开的文件描述符的引用?举个例子:
filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)
Run Code Online (Sandbox Code Playgroud)
第一个File实例被打开,但对象的引用不存储在变量中.第二个实例被存储在文件句柄,其中I可以很容易地与#inspect或#关闭访问它.
但是,丢弃的File对象没有消失; 它只是无法以任何明显的方式访问.在对象完成之前,Ruby必须在某个地方跟踪它...但在哪里?
我在ASP.NET应用程序中使用.NET中的GDI +进行了大量的图像处理.
我经常发现Image.FromFile()保持文件句柄打开.
为什么是这样?在没有保留文件句柄的情况下打开图像的最佳方法是什么.
open(my $fh, '>', $path) || die $!;
my_sub($fh);
Run Code Online (Sandbox Code Playgroud)
my_sub()能以某种方式从$ fh推断出$ path吗?
一个简单的程序,带有while( <> )句柄文件作为arguments(./program 1.file 2.file 3.file)和Unix系统的标准输入.
我认为它将它们连接在一起,并且工作是一行一行的.问题是,我怎么知道我正在使用第一个文件?然后是第二个.
举个简单的例子,我想在一行中打印文件的内容.
while( <> ){
print "\n" if (it's the second file already);
print $_;
}
Run Code Online (Sandbox Code Playgroud) 如何查找进程中的所有打开文件(来自内部)?
在fork()(之前exec())之后知道这似乎很有用.
我知道它的存在性getdtablesize()和可移植性sysconf(_SC_OPEN_MAX),但是尝试关闭每个有效的文件描述符似乎效率低下,无论是否有一个打开的文件.(我也意识到过早优化的危险,这更多是关于美学我猜:-)
我想创建一个简单的IO对象,它表示打开到另一个程序的管道,我可以在我的应用程序运行时定期写入另一个程序的STDIN.我希望它能够防弹(因为它可以捕获所有错误)和跨平台.我能找到的最佳选择是:
opensub io_read {
local $SIG{__WARN__} = sub { }; # Silence warning.
open my $pipe, '|-', @_ or die "Cannot exec $_[0]: $!\n";
return $pipe;
}
Run Code Online (Sandbox Code Playgroud)
好处:
缺点
$SIG{PIPE}从管道程序捕获错误sub io_read {
IO::Pipe->reader(@_);
}
Run Code Online (Sandbox Code Playgroud)
好处:
缺点
$SIG{PIPE}从管道程序中捕获错误在IPC :: Run中没有用于写入文件句柄的接口,只是附加到标量.这似乎......很奇怪.
这里也没有文件句柄接口.我可以使用代码引用,它将被重复调用以假脱机到子代,但是看看源代码,它似乎实际写入临时文件,然后打开它并将其内容假脱机到管道命令STDIN.世界卫生大会?
仍然没有文件句柄接口.
我在这里错过了什么?似乎这应该是一个已经解决的问题,而且我有点惊讶它不是.IO :: Pipe最接近我想要的,但缺乏$SIG{PIPE}错误处理和缺乏对Windows的支持是令人痛苦的.JDWIM的管道模块在哪里?