2011-02-01 24 views
-1

我正在調試一段代碼,它使用Perl '-s'函數來獲取某些文件的大小。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以某種方式損壞。 我甚至在-s之前添加了一個測試if (-e $File)|{以確保該文件存在,但是這三個文件確實存在。

還有一個更奇怪的事:有在/myfolder/.../mysubfolder1/.htaccess/myfolder/.../mysubfolder2/沒有.htaccess。如果相反,我認爲.htaccess會以某種方式阻止-s呼叫。

有什麼想法?

+4

對於$ file2究竟構成「不起作用」? – DVK 2011-02-01 20:41:51

回答

10

如果-s失敗,則返回undef並將錯誤設置爲$ !.什麼是$!?

+3

$!返回'包含換行符的文件名的不成功統計'。有了這個,我可以解決這個問題。謝謝。 – Pit 2011-02-02 07:32:56

5

我想如果你用「stat」檢查那個文件的大小,你會得到少於1024個字節的東西:) 如果size小於0,你的int(( - s $ fn)/ 1024)將返回0 1024

+0

如果您正在測量文件的塊大小,則可以使用類似於「int((1023 + -s $ file)/ 1024)」的成語「 – mob 2011-02-01 19:42:26

+0

Stat」返回1936的文件大小。 – Pit 2011-02-02 07:31:52

4

變化int((-s $file)/1024)sprintf('%.0f', (-s $file)/1024) - 你會看到的東西,然後將文件大概是在1024個字節,因此int()將愉快地返回0

5

爲了解決您的評論的結尾,.htaccess文件控制訪問文件由網絡服務器的請求。一旦用戶請求一個執行有效CGI/URL的URL(我假設你的Perl代碼在web上下文中),那麼腳本絕對沒有關於.htaccess的許可問題(除非你實際編寫Perl來讀取它的內容並用手明確地予以尊重)。

唯一可以搞砸你的Perl文件的權限是操作系統中的文件系統權限。

要獲取文件大小,您的網絡用戶需要:

  • 上的目錄執行包含文件

  • 可能權限,讀權限對包含該文件(如果不知道該目錄文件大小存儲在inode中?)

  • 可能對文件iteself的讀取權限。

如果您的3個文件(2個好文件和1個壞文件)都在同一個目錄中,請檢查文件的讀取權限。

如果它們位於不同的目錄中,請檢查文件的讀取權限和目錄權限。