2011-04-07 90 views
3

我在運行linux 2.6.32的嵌入式設備上使用python。os.path.getsize()爲大文件返回負文件大小(對於大於3GB的文件大小)

使用python獲取文件大小爲os.path.getsize()會給我一個負值。

我提到這裏的堆棧溢出similar questions之一,並嘗試重新編譯python與CFLAGS='-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64' OPT="-g -O2 $CFLAGS" 但仍然返回負文件大小。

我在Linux 2.6.32上使用python 2.6.4和Django 1.2.4。

任何人都可以告訴我問題在哪裏嗎?

+0

讀到這個問題,我認爲Linux內核也需要支持大文件;如果它是嵌入式設備,則可能不會編譯爲支持大文件。 – 2011-04-07 11:42:53

+0

但「ls -lh」顯示正確的文件大小。 – 2011-04-07 11:53:58

回答

2

顯然,您的Linux發行版的Python版本出了問題。而不是解決實際問題,只是解決它可能更容易:

def getsize_workaround(filename): 
    size = os.path.getsize(filename) 
    if size < 0: 
     import subprocess as s 
     size = long(s.Popen("ls -l %s | cut -d ' ' -f5" % filename, 
        shell=True, stdout=s.PIPE).communicate()[0]) 
    return size 
+0

不錯的主意,但如果文件大小介於4和6GB之間,該怎麼辦?據推測,代碼會得到(並返回)一個正確的數字,這是錯誤的? – NPE 2011-04-07 15:03:35

+0

啊,好點。 32位翻滾可能會多次發生。只是放棄條件並總是使用'​​ls -l'包裝將會更可靠。 – Rakis 2011-04-07 16:36:05