FTP操作后清理资源的正确方法是什么?

时间:2011-04-10 02:13:13

标签: c# .net ftp

使用FTP上传文件后,我该怎么办?我通常只关闭两个流,即:

sourceStream.Close();
requestStream.Close();

如果它们保持开放会有什么影响?其他用户是否可以使用相同的凭据登录?我能再次登录吗?

以下是更好理解的完整代码:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(
                          "bbbbb" + "bbbbbb" + "bbb/" + hj + "/" + hjj + ".txt");
request.Credentials = new NetworkCredential("bbbbb", "bbbbbb");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = true;

StreamReader sourceStream = new StreamReader(j + @"oo.txt");
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);

sourceStream.Close();
requestStream.Close();

此外,我有时只使用request.open方法 - 没有分配任何close()方法,然后在FTP操作的最后使用request.Abort()。这有任何意义吗?

2 个答案:

答案 0 :(得分:1)

嗯,MSDN documentation州:

  

使用FtpWebRequest对象将文件上载到服务器时,必须将文件内容写入通过调用GetRequestStream方法或其异步对应方(BeginGetRequestStream和EndGetRequestStream方法)获得的请求流。您必须先写入流并在发送请求之前关闭流。

表示如果不关闭请求流,可能会发生错误。如果您不关闭源流,那么您很可能最终会锁定文件,拒绝访问以供将来的请求和/或其他用户使用 - 尽管它取决于底层操作系统和文件的共享模式。

至于关闭请求:我没有使用WebRequest&但是,按照上面提到的MSDN文档,你应该遵循的模式似乎是

  • 创建请求
  • 获取请求流
  • 写下您的数据
  • 关闭请求流
  • 获取回复
  • 关闭响应对象(我假设完成了请求)

除非你知道,否则这样做可能是个好主意。

答案 1 :(得分:0)

这是一种更清洁的方式,使用更少的流,并在完成后正确关闭它们。

Uri requestUri = new Uri(string.Concat("bbbbb", "bbbbbb", "bbb/", hj, "/", hjj, ".txt"));
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(requestUri);
request.Credentials = new NetworkCredential("bbbbb", "bbbbbb");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UsePassive = true;

byte[] fileContents = File.ReadAllBytes(@"oo.txt");
request.ContentLength = fileContents.Length;

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.Write(fileContents, 0, fileContents.Length);
}

WebRequest.Abort用于终止异步操作,但是没有。不要在这里打电话。请按照Mitch Wheat的评论中的建议调查我所包含的using声明。它会自动处理流对象。

至于您的其他问题,当然有人可以使用相同的凭据登录FTP服务器,但不能因为您的代码而导致。相同的凭据将始终成功登录。我认为您担心将连接保持活动状态,但这是服务器要处理的问题。