从 FTP 服务器随机读取 returns 一个空白文本文件
Reading from FTP Server randomly returns a blank text file
首先,我确实尝试为我的问题寻找答案,但没有找到。
我一直在制作一个程序,其中我的本地文本文件和位于 FTP 服务器中的在线文本文件自动相互更新。文本文件包含名称列表。此应用程序旨在供不同机器同时使用,并且可以在列表中添加和删除名称。
在额外算法的帮助下,我能够合并本地和在线文本文件,即使在离线使用时也不会出现问题,并且只在有互联网连接时更新(使用额外的本地文件)。
现在问题来了,90% 的时间一切正常。然而,有时从 FTP 服务器 returns 下载的文本文件是一个空白文本文件,即使它不是。我注意到当我的应用程序很难检查互联网连接时(Pinging google.com),最有可能发生这种情况。这将导致完全删除列表,因为我的应用程序会将其解释为 "The other user using the application deleted the list".
这是我从FTP服务器下载的方法:
public Boolean DownloadFile(string uri, string path)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.UsePassive = true;
request.KeepAlive = true;
request.UseBinary = true;
request.Proxy = null;
request.Timeout = 5000;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(this.username, this.password);
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
StringBuilder sb = new StringBuilder();
sb.AppendLine(reader.ReadToEnd());
File.WriteAllText(path, sb.ToString());
reader.Close();
response.Close();
return true;
}
catch (Exception e )
{
MessageBox.Show("FTPHANDLER DOWNLOAD FILE:"+e.ToString());
return false;
}
}
我用来检查网络连接的方法:
private static bool CheckForInternetConnection()
{
try
{
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 15000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
return (reply.Status == IPStatus.Success);
}
catch (Exception e)
{
//MessageBox.Show(e.ToString());
return false;
}
}
我就是这样称呼它的。我已经提供了安全措施以防止这种情况发生,但它仍然会发生。
public void Update()
{
if(CheckForInternetConnection()){
if (DownloadFile(uri,path))
{
char[] charsToTrim = { '\r', '\n' };
string onlineFile = File.ReadAllText(path).TrimEnd(charsToTrim);
if (onlineConfigFile.Equals("") || onlineConfigFile == null)
MessageBox.Show("Downloaded file is empty");
//still do stuff here regardless of the message
//If the other user really do intend to delete the list
}
}
}
更新方法在不同的线程中执行。
至于我的第一个post,抱歉,它原来很长。我确实试图让它简短,但不想错过任何细节。
由于我的问题的性质(随机),我认为 "lock" 解决方案为我解决了问题,因为在我使用它一段时间后问题没有出现。可能是因为每 5 秒生成一次的线程导致了它们同时处理方法的不同部分的问题。
固定代码如下:
public void Update()
{
lock(lockObject)
{
if(CheckForInternetConnection())
{
if (DownloadFile(uri,path))
{
char[] charsToTrim = { '\r', '\n' };
string onlineFile = File.ReadAllText(path).TrimEnd(charsToTrim);
if (onlineConfigFile.Equals("") || onlineConfigFile == null)
MessageBox.Show("Downloaded file is empty");
//still do stuff here regardless of the message
//If the other user really do intend to delete the list
}
}
}
}
我将"lockObject"声明为class级变量,数据类型为"Object"。
首先,我确实尝试为我的问题寻找答案,但没有找到。
我一直在制作一个程序,其中我的本地文本文件和位于 FTP 服务器中的在线文本文件自动相互更新。文本文件包含名称列表。此应用程序旨在供不同机器同时使用,并且可以在列表中添加和删除名称。
在额外算法的帮助下,我能够合并本地和在线文本文件,即使在离线使用时也不会出现问题,并且只在有互联网连接时更新(使用额外的本地文件)。
现在问题来了,90% 的时间一切正常。然而,有时从 FTP 服务器 returns 下载的文本文件是一个空白文本文件,即使它不是。我注意到当我的应用程序很难检查互联网连接时(Pinging google.com),最有可能发生这种情况。这将导致完全删除列表,因为我的应用程序会将其解释为 "The other user using the application deleted the list".
这是我从FTP服务器下载的方法:
public Boolean DownloadFile(string uri, string path)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.UsePassive = true;
request.KeepAlive = true;
request.UseBinary = true;
request.Proxy = null;
request.Timeout = 5000;
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential(this.username, this.password);
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
StringBuilder sb = new StringBuilder();
sb.AppendLine(reader.ReadToEnd());
File.WriteAllText(path, sb.ToString());
reader.Close();
response.Close();
return true;
}
catch (Exception e )
{
MessageBox.Show("FTPHANDLER DOWNLOAD FILE:"+e.ToString());
return false;
}
}
我用来检查网络连接的方法:
private static bool CheckForInternetConnection()
{
try
{
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 15000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
return (reply.Status == IPStatus.Success);
}
catch (Exception e)
{
//MessageBox.Show(e.ToString());
return false;
}
}
我就是这样称呼它的。我已经提供了安全措施以防止这种情况发生,但它仍然会发生。
public void Update()
{
if(CheckForInternetConnection()){
if (DownloadFile(uri,path))
{
char[] charsToTrim = { '\r', '\n' };
string onlineFile = File.ReadAllText(path).TrimEnd(charsToTrim);
if (onlineConfigFile.Equals("") || onlineConfigFile == null)
MessageBox.Show("Downloaded file is empty");
//still do stuff here regardless of the message
//If the other user really do intend to delete the list
}
}
}
更新方法在不同的线程中执行。
至于我的第一个post,抱歉,它原来很长。我确实试图让它简短,但不想错过任何细节。
由于我的问题的性质(随机),我认为 "lock" 解决方案为我解决了问题,因为在我使用它一段时间后问题没有出现。可能是因为每 5 秒生成一次的线程导致了它们同时处理方法的不同部分的问题。
固定代码如下:
public void Update()
{
lock(lockObject)
{
if(CheckForInternetConnection())
{
if (DownloadFile(uri,path))
{
char[] charsToTrim = { '\r', '\n' };
string onlineFile = File.ReadAllText(path).TrimEnd(charsToTrim);
if (onlineConfigFile.Equals("") || onlineConfigFile == null)
MessageBox.Show("Downloaded file is empty");
//still do stuff here regardless of the message
//If the other user really do intend to delete the list
}
}
}
}
我将"lockObject"声明为class级变量,数据类型为"Object"。