通过FTP将文件复制到服务器后的文件大小差异

46
我已经创建了一个PHP脚本来更新一个位于本地目录内的Web服务器。现在我正在将这个脚本迁移到Python中。它大部分情况下都能正常工作,但是在执行PUT命令后,文件大小似乎发生了变化。因此,文件大小与服务器上的文件不同。
当我再次从FTP服务器下载文件时,唯一的区别是CR / LF标记。这让我很烦恼,因为同样的脚本正在比较要更新的文件的大小。另外,如果有什么意义的话,在PHP via ftp_put中脚本可以完美地工作。
from ftplib import FTP

ftpserver = "myserver"
ftpuser = "myuser"
ftppass = "mypwd"

locfile =  "g:/test/style.css"
ftpfile =  "/temp/style.css"

try:
    ftp = FTP(ftpserver, ftpuser, ftppass)
except:
    exit ("Cannot connect")

f = open (locfile, "r")
try:
    ftp.delete (ftpfile)
except:
    pass

# ftp.sendcmd ("TYPE I")
# ftp.storlines("STOR %s" % ftpfile, f)
ftp.storbinary("STOR %s" % ftpfile, f)
f.close()

ftp.dir (ftpfile)
ftp.quit()

有什么建议吗?

3个回答

17

您需要使用 rb 以二进制方式打开 locfile 吗?

f = open (locfile, "rb")

非常感谢,这正是我需要的启示,我整个周末都在为此苦苦挣扎。同样适用于相反的情况,从FTP传输。 - snarkyname77
@PabloG 你刚才真的发了那条评论吗?还是我被卷入了时间漩涡? - David Sykes

3
如果你在Windows或*nix环境下查看文件的属性,你会注意到有两个大小。一个是扇区大小,另一个是实际大小。扇区大小是硬盘上使用的以字节为单位的扇区数。这是因为大多数现代文件系统不能在同一个扇区中放置两个文件,所以如果你的文件占据了半个扇区,整个扇区都会被标记为已满。
因此,你可能正在将扇区文件大小与FTP服务器上的实际文件大小进行比较,或者反过来。

0

无论大小,小文件在文件系统中占用整个节点。

我的主机倾向于将所有小文件在ftp中报告为4KB,但在shell中会给出准确的大小,所以这可能是ftp客户端常见的“特性”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接