我正在使用FTP協議上傳和下載大文件的個人項目。除了我最近注意到的內存泄漏外,它工作正常。我不清楚問題是什麼。這可能是內存泄漏或編程不當。此應用程序使用的內存量在上傳時每秒增加。這裏是代碼:FTP上傳 - 內存泄漏問題
Action action;
int bufferSize = 16384;
EventLogger elog = new EventLogger();
string error = "";
string filename = "";
public Uploader(Action action)
{
this.action = action;
filename = action.directory.Substring(action.directory.LastIndexOf('\\') + 1,
action.directory.Length - action.directory.LastIndexOf('\\') - 1);
}
public bool startUpload()
{
try
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://*******");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("***", "***");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
List<string> files = new List<string>();
string[] filesArr = reader.ReadToEnd().Split('\n');
reader.Close();
response.Close();
foreach (string file in filesArr)
files.Add(file.Replace("\r", ""));
if (files.IndexOf(filename) != -1)
{
request = (FtpWebRequest)WebRequest.Create("ftp://***/"+filename);
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.Credentials = new NetworkCredential("***", "***");
response = (FtpWebResponse)request.GetResponse();
reader.Close();
response.Close();
if (response.StatusCode != FtpStatusCode.FileActionOK)
{
return false;
}
}
request = (FtpWebRequest)WebRequest.Create("ftp://***/"+filename);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.KeepAlive = false;
request.UseBinary = true;
FileStream stream = File.OpenRead(action.directory);
byte[] buffer = new byte[bufferSize];
Stream reqStream = request.GetRequestStream();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "update DIRECT_UPLOAD set COMPLETED = @com, PROGRESS = @prog, SPEED = @speed where ID = @id";
cmd.Parameters.AddWithValue("@id", action.id);
cmd.Parameters.AddWithValue("@com", 0);
cmd.Parameters.AddWithValue("@prog", 0);
cmd.Parameters.AddWithValue("@speed", 0);
long i = 0;
int readed = 0;
int total = 0;
int speed = 0;
DateTime last = DateTime.Now;
int lastTotal = 0;
while ((readed = stream.Read(buffer, 0, bufferSize)) > 0)
{
reqStream.Write(buffer, 0, readed);
total += readed;
if (i % 100 == 0)
{
cmd.Parameters["@com"].Value = total;
cmd.Parameters["@prog"].Value = (int)(((double)total/action.size) * 100);
int tot = 0;
tot = total - lastTotal;
int time = Convert.ToInt32((DateTime.Now - last).TotalMilliseconds);
speed = (int)(((double)1000.0/time) * tot);
cmd.Parameters["@speed"].Value = speed;
if ((error = SqlProcess.sqlNonQuery(cmd)) != "")
throw new Exception(error);
last = DateTime.Now;
lastTotal = total;
}
Application.DoEvents();
i++;
}
cmd.Parameters["@com"].Value = total;
cmd.Parameters["@prog"].Value = 100;
cmd.Parameters["@speed"].Value = 0;
if ((error = SqlProcess.sqlNonQuery(cmd)) != "")
throw new Exception(error);
reqStream.Close();
stream.Close();
}
catch (Exception ex)
{
elog.write(ex);
return false;
}
return true;
}
謝謝。
首先,您應該對所有實現IDisposable的類的實例(如Stream)使用using語句,以確保即使發生異常時它們也會關閉並清理乾淨。 – sloth 2010-10-14 14:23:01