首页 > 解决方案 > 为什么我在 .rename 上收到“ftplib.error_perm: 550 Access denied”?

问题描述

我正在上传一个文件,然后我想移动它。上传部分有效,但移动尝试引发访问错误。这是为什么?我也尝试移动目录中已经存在的文件,但这会导致同样的错误。

为了简化,我正在“移动”我成功写入的目录中的文件。FTP 设置允许对该帐户进行读/写/执行,并且使用 Filezilla 我也可以重命名文件。

代码:

import ftplib

testfile = "D:\movethis.txt";
session = ftplib.FTP('<IP>', '<U>', '<P>');
session.cwd("XXX\TestPyUpload\upload");
print(session.pwd());
file = open(testfile, 'rb');
session.storbinary('STOR movethis.txt', file);

session.rename("XXX\TestPyUpload\upload\movethis.txt", "XXX\TestPyUpload\upload\movethis2.txt");
file.close();
session.quit();

标签: pythonftp

解决方案


session.cwd("XXX\TestPyUpload\upload");

您当前的工作目录现在是XXX\TestPyUpload\upload.

session.storbinary('STOR movethis.txt', file);

这会将文件保存movethis.txt到您当前的工作目录中,即路径为XXX\TestPyUpload\upload\movethis.txt.

session.rename("XXX\TestPyUpload\upload\movethis.txt", "XXX\TestPyUpload\upload\movethis2.txt");

目前尚不清楚究竟XXX是什么。但是,如果它不以 a 开头,\则它是一条相对路径。在这种情况下,rename命令中的名称被解释为相对于当前工作目录 ( XXX\TestPyUpload\upload),即您将重命名XXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis.txtXXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis2.txt. 源目录和目标目录都不存在,这就解释了服务器抛出的错误。

...session.rename("movethis.txt", "movethis2.txt");确实有效。

这些名称也被解释为相对于工作目录,即您重命名XXX\TestPyUpload\upload\movethis.txtXXX\TestPyUpload\upload\\movethis2.txt您最初的意图。

...也是如此session.rename("\XXX\TestPyUpload\upload\movethis.txt", "\XXX\TestPyUpload\upload\movethis2.txt");\在开头添加)。

在这种情况下,您使用的是绝对文件名,这就是它不考虑当前工作目录的原因,从而避免了您原来的问题。


推荐阅读