我正在调试一段代码,它使用Perl '-s'函数来获取某些文件的大小。
my $File1 = /myfolder/.../mysubfolder1/document.pdf
my $File2 = /myfolder/.../mysubfolder2/document.pdf
my $File3 = /myfolder/.../mysubfolder1/document2.pdf
$File3
实际上是/myfolder/.../mysubfolder2/document.pdf
又名$File2
的链接
有缺陷的代码是:
my $size = int((-s $File)/1024);
$File
替换为$File1
- $File3
。
由于某些原因,我无法解释这不适用于每个文件。
适用于$File1
和$File3
,但不适用于$File2
。我可以理解,$File2
和$File3
都不起作用,这意味着文件/myfolder/.../mysubfolder2/document.pdf
在某种程度上是腐败的。
我甚至在if (-e $File)|{
之前添加了一个测试-s
以确保该文件存在,但这三个文件确实存在。
更奇怪的是:.htaccess
中有/myfolder/.../mysubfolder1/
但.htaccess
中没有/myfolder/.../mysubfolder2/
。如果它是反向的,我会认为.htaccess
会以某种方式阻止-s
调用。
有什么想法吗?
答案 0 :(得分:10)
如果-s失败,则返回undef并将错误设置为$!。什么是$!?
答案 1 :(得分:5)
我想如果用“stat”检查那个文件的大小,你会得到小于1024字节的东西:) 如果size小于1024
,你的int(( - s $ fn)/ 1024)将返回0答案 2 :(得分:5)
为了解决评论的结束,.htaccess
文件控制通过网络服务器的请求访问文件。一旦用户请求执行有效的允许CGI /任何脚本的URL(我假设您的Perl代码在Web上下文中),那么该脚本绝对没有关于.htaccess的权限问题(除非您实际编写Perl代码以读取其内容)并明确地尊重他们。)
唯一可以搞砸Perl文件的权限是操作系统中的文件系统权限。
要获取文件大小,您的网络用户需要:
对包含文件
可能是对包含该文件的目录的读取权限(不确定文件大小是否存储在inode中?)
可能是对文件的读取权限。
如果所有3个文件(2个好文件和1个坏文件)都在同一目录中,请检查文件的读取权限。
如果它们位于不同的目录中,请检查文件的读取权限和目录权限。
答案 3 :(得分:4)
将int((-s $file)/1024)
更改为sprintf('%.0f', (-s $file)/1024)
- 您会看到一些内容,该文件可能不到1024字节,因此int()
将很乐意返回0.