【问题标题】:Why am I getting "ftplib.error_perm: 550 Access denied" on .rename? [closed]为什么我在 .rename 上收到“ftplib.error_perm: 550 Access denied”? [关闭]
【发布时间】:2019-09-01 19:55:06
【问题描述】:

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

为了简化,我正在“移动”我成功写入的目录中的文件。 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();

【问题讨论】:

  • 您为客户端提供了代码,但对服务器一无所知 - 即使生成错误消息的是服务器。无论如何,我会尝试简化代码以不按完整路径重命名,而仅按文件名重命名(即movethis.txt 而不是XXX\TestPyUpload\upload\movethis.txt)。这在逻辑上应该是相同的,因为您的 CWD 已经是XXX\TestPyUpload\upload。也许它会起作用,但是(未知的)服务器可能会限制在上传目录中可以做什么(检查您的服务器配置)。此外,您最好在代码中转义您的\
  • 另外,您是否使用任何现有的 FTP 客户端测试重命名/移动文件?它有效吗?向我们展示它的日志文件。
  • @SteffenUllrich 我对服务器一无所知。 session.rename("movethis.txt", "movethis2.txt"); 确实有效。 session.rename("\XXX\TestPyUpload\upload\movethis.txt", "\XXX\TestPyUpload\upload\movethis2.txt"); 也是如此(在开头添加了 \)。奇怪的是,当我这样做时,“上传”中的文件也被重命名,文件夹“服务”保持为空:session.rename("\XXX\TestPyUpload\upload\movethis.txt", "\XXX\TestPyUpload\serve\movethis2.txt"); 相当混乱..

标签: python ftp


【解决方案1】:
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 到底是什么。但是,如果它不是以\ 开头,则它是相对路径。在这种情况下,rename 命令中的名称被解释为相对于当前工作目录 (XXX\TestPyUpload\upload),即您将 XXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis.txt 重命名为 XXX\TestPyUpload\upload\XXX\TestPyUpload\upload\movethis2.txt。源目录和目的目录都不存在,这就解释了服务器抛出的错误。

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

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

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

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

【讨论】:

  • 我明白了,谢谢。但是为什么session.rename("\XXX\TestPyUpload\upload\movethis.txt", "\XXX\TestPyUpload\serve\movethis2.txt"); 会重命名“上传”文件夹中的文件而不是将其移动到“服务”?我发现当我在执行移动之前 cwd 到“服务”目录时得到 550,我猜这意味着我不允许写入“服务”,但为什么文件在不应该重命名的地方被重命名?
  • @MapEngine:我不知道。在我对此提出任何想法之前,我需要自己玩弄服务器。但一般来说,使用\ 作为路径分隔符是个坏主意,因为分隔符通常是/,除了Windows 服务器(甚至这些通常除了/)。此外,\ 具有特殊含义(如\n\020...),因此应在代码中正确转义。
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2022-01-14
  • 2013-06-07
  • 2022-07-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多