FtpWebRequest 不会通过 FTP 删除文件 - 但可以找到文件
FtpWebRequest doesn't delete file through FTP - But can find file
你好
我在我正在处理的当前脚本中发现了一个问题。
当我尝试使用 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 找到了文件,但没有删除。
我已经检查了用户文件夹的权限,我的站点可以很好地编辑文件。它只是没有删除。
此致。
我注意到我自己的代码中有一个关于 WebRequestMethods.Ftp.DeleteFile 的错误;
里面没有放一个return false;在(以防它不符合标准)。
已找到解决方案。
你好
我在我正在处理的当前脚本中发现了一个问题。
当我尝试使用 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 找到了文件,但没有删除。
我已经检查了用户文件夹的权限,我的站点可以很好地编辑文件。它只是没有删除。
此致。
我注意到我自己的代码中有一个关于 WebRequestMethods.Ftp.DeleteFile 的错误; 里面没有放一个return false;在(以防它不符合标准)。
已找到解决方案。