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

46 投票
3 回答
5593 浏览
提问于 2025-04-10 23:59

我写了一个PHP脚本,用来更新一个在本地目录里的在线网页服务器。现在我把这个脚本迁移到Python。大部分情况下它运行得很好,但在执行PUT命令后,文件的大小似乎发生了变化。因此,文件的大小和服务器上的文件不一样。

当我再次从FTP服务器下载这个文件时,唯一的区别就是CR/LF标记。这让我很烦恼,因为同样的脚本在比较文件大小时需要更新。而且,如果这有什么意义的话,这个脚本在PHP中通过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 个回答

0

小文件在文件系统中占用一个完整的节点,不管它们的实际大小是多少。

我的主机在ftp上通常会把所有小文件都显示为4KB,但在命令行中显示的大小是准确的,所以这可能是ftp客户端的一个“特性”。

3

如果你在Windows或者其他类Unix系统中查看文件的属性,你会看到两个大小。一个是扇区大小,另一个是实际大小。扇区大小是指在你的硬盘上占用的字节数。因为在大多数现代文件系统中,两个文件不能共用同一个扇区,所以如果你的文件只占用了扇区的一半,整个扇区都会被标记为已满。

所以你可能是在比较扇区文件大小和FTP服务器上的实际文件大小,或者反过来。

17

你需要用二进制模式打开locfile吗?也就是用rb吗?

f = open (locfile, "rb")

撰写回答