首页 > 解决方案 > FtpWebRequest 不会通过 FTP 删除文件 - 但可以找到文件

问题描述

你好呀。

我在我正在处理的当前脚本中发现了一个问题。

当我尝试使用 FTPWebRequest 从 FTP URI 中删除文件时 - 我遇到了一个错误,它实际上确实找到了文件(检查存在),但是 - 它只是由于某种原因没有删除它。

我可以找到该文件,并通过我的脚本对其进行编辑——没问题;如果被问到,它只是不会触发删除。让我给你一个启动它的 ActionResult 的例子。

    if (server.Protocol.Equals("FTP"))
    {

        Uri serverUri = null;
        serverUri = new Uri($"{server.Server}/TheIsle/Saved/Databases/Survival/Players/{dino.SteamId}.json", UriKind.Absolute);
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            throw new FileNotFoundException();
        }
        var isDeleted = DinosaurWorker.DeleteTextFromFtpURI(config, _context, serverUri, dino);
        if (isDeleted)
            return Ok();
        return Unauthorized();
    }

正如您在此处看到的,正在调用 DeleteTextFromFtpURI (isDeleted)

这是 DeleteTextFromFTPURI - 它应该包括:

WebRequestMethods.Ftp.DeleteFile;

 internal static bool DeleteTextFromFtpURI(NetworkConnection config, ApplicationDbContext context, Uri serverURI, Dinos dino, string user = "")
        {
            WebClient request = new WebClient();

            request.Credentials = new NetworkCredential(config.Username, config.Password);

            try
            {
                byte[] newFileData = request.DownloadData(serverURI);
                string fileString = Encoding.UTF8.GetString(newFileData);
                var player = JsonConvert.DeserializeObject<Player>(fileString);
                var dinosaurDbName = dino.Dinosaur.GetAttribute<DisplayAttribute>().Name;
                if (player.CharacterClass == dinosaurDbName && player.Growth == "1.0")
                {
                    SavePlayer(context, dino, player);
                    var x = JsonConvert.SerializeObject(player);
                    var buffer = Encoding.UTF8.GetBytes(x);
                    FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(serverURI);

                    ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
                    ftpRequest.Credentials = new NetworkCredential(config.Username, config.Password);
                    FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
                    response.Close();
                }

                LogAction(context, dino.SteamId, $"Dinosaur: {player.CharacterClass} should have been deleted", user);
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

LogAction 完成,我可以在网站日志中看到该文件应该被删除,但是 - 我仍然能够看到该文件。

让我重新表述一下 FTP 连接确实有效,它确实检查文件是否存在 - 它确实通过 ftp 找到了文件,但没有发生删除。

我已经检查了用户文件夹权限,我的网站可以很好地编辑文件。它只是不会删除。

此致。

标签: .net-coreftpwebrequest

解决方案


我注意到我自己的代码中有一个关于 WebRequestMethods.Ftp.DeleteFile 的错误;没有放入一个 return false ;在(如果它不符合标准)。

找到解决方案。


推荐阅读