gpt4 book ai didi

c# - 当命令在 .NET 中的 FTP 服务器上失败时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:20 24 4
gpt4 key购买 nike

我有这个源代码:

public static void FTP_SERVER()
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
ArrayList directories = new ArrayList();
while (!reader.EndOfStream)
{
String directory = reader.ReadLine();
int i = 0;
for (i = 0; i < directories.Count && Convert.ToInt32(directory) > Convert.ToInt32(directories[i] + ""); i++);
directories.Insert(i, directory);
}
String[] agents = Crawler.CrawlerDbUtils.getAllAgentIDs();

reader.Close();
response.Close();
int j = 0;
for (int i = 0; i < directories.Count; i++)
{
try
{
while ((j < agents.Length) && (Convert.ToInt32(agents[j]) < Convert.ToInt32(directories[i] + "")))
{
try
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + agents[j]);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
response.Close();
}
catch (Exception exception)
{ }
j++;
}
if (Convert.ToInt32(agents[j]) == Convert.ToInt32(directories[i] + ""))
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
ArrayList files = new ArrayList();
while (!reader.EndOfStream)
{
String file = reader.ReadLine();
int q = 0;
for (q = 0; q < files.Count && file.CompareTo(files[q] + "") > 0; q++) ;
files.Insert(q, file);
}
reader.Close();
response.Close();
String[] dbFiles = Crawler.CrawlerDbUtils.getAllPictures(directories[i] + "");
int r = 0;
for (int q = 0; q < files.Count; q++)
{
while ((r < dbFiles.Length) && ((dbFiles[r] + "").CompareTo(files[q] + "") < 0))
{
r++;
}
try
{
if ((r >= dbFiles.Length) || ((dbFiles[r] + "").Equals(files[q]) == false))
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/" + files[q]);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
response.Close();
}
}
catch (Exception exception)
{ }
}
j++;
}
else
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
ArrayList files = new ArrayList();
while (!reader.EndOfStream)
{
files.Add(reader.ReadLine());
}
reader.Close();
response.Close();
for (int k = 0; k < files.Count; k++)
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/" + files[k]);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
response.Close();
}
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + directories[i] + "/");
request.Method = WebRequestMethods.Ftp.RemoveDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
response.Close();
}
}
catch (Exception exception)
{
}
}
while (j < agents.Length)
{
try
{
request = (FtpWebRequest)WebRequest.Create("ftp://myurl.com/mainfolder/" + agents[j] + "/");
request.Method = WebRequestMethods.Ftp.MakeDirectory;
request.Credentials = new NetworkCredential("myusername", "mypassword");
response = (FtpWebResponse)request.GetResponse();
responseStream = response.GetResponseStream();
response.Close();
}
catch (Exception exception)
{ }
j++;
}
MessageBox.Show("DONE");

}

它用于从服务器中删除不推荐使用的目录和文件。我有一个主文件夹,其中所有子文件夹都是数字,所有子文件夹只包含文件(没有子文件夹的子文件夹)

服务器上的文件夹将存储在一个称为目录的 ArrayList 中。

存储在数据库中的目录 ID 将被加载到称为代理的 String[] 中。

目录会按升序排列,同理,agent也会按升序排列(本项目都是数字,所以按数字排序)

如果一个目录在服务器上存在,但在数据库中不存在,则将其删除(先删除其所有文件,然后再删除文件夹本身)

如果一个目录在服务器上不存在,但存在于存储的目录列表中,则将在服务器上创建它。

如果一个目录存在于服务器上并且也在存储的目录列表中,则不推荐使用的文件将被删除。服务器上相应目录下的文件称为files,而数据库中存储的文件则存储在一个名为dbFiles的String[]中。

这个函数本质上就是创建要创建的文件夹,删除要删除的文件夹,删除要删除的文件,就可以了。但是,我注意到在某些情况下,当发生服务器错误时,索引会下降,我想知道可能是什么原因。

例如 i = 500 并且(我不知道为什么)当 i = 100 时,命令会捕获到服务器错误并且 i 降回 100。

我的问题是:为什么我的索引会在捕获到之前发生的错误时回落?

j 会回到 i 100 岁时的状态吗?

如何防止这种回退?

最佳答案

你应该重构你的代码,使 ftp 命令在函数中,而不是到处复制/粘贴这些 ftp 命令,你有一些像这样的流程:

String[] directories = ftpGetListing("ftp://myurl.com/mainfolder/");
String[] agents = Crawler.CrawlerDbUtils.getAllAgentIDs();

String[] combinedDirectories = getElementsInBothArray(directories, agents);
String[] serverOnlyDirectories = getElementsOnlyInFirstArray(directories, agents);
String[] agentOnlyDirectories = getElementsOnlyInFirstArray(agents, directories);

// step 1: delete all server only directories
ftpDeleteDirectories("ftp://myurl.com/mainfolder/", serverOnlyDirectories);

// step 2: create all agent only directories
ftpCreateDirectories("ftp://myurl.com/mainfolder/", agentOnlyDirectories);

// step 3: depricate all files
foreach(String dir in combinedDirectories)
{
String ftpDir = "ftp://myurl.com/mainfolder/" + dir + "/";
String[] serverFiles = ftpGetListing(ftpDir);
String[] agentFiles = Crawler.CrawlerDbUtils.getAllPictures(dir);

String[] serverOnlyFiles = getElementsOnlyInFirstArray(serverFiles, agentFiles);

foreach(String file in serverOnlyFiles)
{
ftpDeleteFile(ftpDir + file);
}
}

然后您只需为 ftpGetListingftpDeleteDirectoriesftpCreateDirectoriesftpDeleteFile 实现非常简单的功能。哦,是的,还有一些简单的数组操作函数,例如:getElementsInBothArraysgetElementsOnlyInFitstArray

关于c# - 当命令在 .NET 中的 FTP 服务器上失败时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com