FTP操作后正确的资源清理方法是什么?
本文关键字:方法 是什么 资源 操作 FTP | 更新日期: 2023-09-27 17:49:51
使用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()
。这说得通吗?
MSDN文档说明:
当使用FtpWebRequest对象将文件上传到服务器时,必须将文件内容写入通过调用GetRequestStream方法或其异步对应方法BeginGetRequestStream和EndGetRequestStream方法获得的请求流中。您必须在发送请求之前写入流并关闭流。
表示如果不关闭请求流,可能会发生不好的事情。如果你不关闭源流,那么你很可能会锁定文件,拒绝未来请求和/或其他用户的访问——尽管这取决于底层操作系统和文件的共享模式。
关于关闭请求:我没有使用WebRequest
&然而,根据上述MSDN文档,您应该遵循的模式似乎是
- 创建请求获取请求流
- 写入数据
- 关闭请求流
- 获取响应
- 关闭响应对象(我假设它完成了请求)
这样做可能是个好主意,除非你不知道。
这里有一种更简洁的方法,使用更少的流,并在完成后正确地关闭它们。
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
用于终止异步操作,您没有异步操作。不要在这里叫它。请调查using
声明,我在Mitch Wheat的评论中建议将其包含在内。它将自动处理流对象。
至于您的其他问题,当然有人可以使用相同的凭据登录到FTP服务器,但不是由于您的代码。相同的凭据将始终成功登录。