使用 SSH.NET SftpClient.OpenRead 读取后无法删除 SFTP
SFTP cannot be deleted after having been read using SSH.NET SftpClient.OpenRead
我正在使用 Renci.SshNet 连接到 SFTP 并逐个循环浏览文件夹中的文件,并在读取文件后删除。然后我们继续下一个文件。但我观察到一个问题,我无法删除文件。当我尝试 sftp.DeleteFile(item.FullName);
时,它给出 “没有这样的文件” 错误消息。
下面是给出上述问题的示例代码。
using (SftpClient sftp = new SftpClient(con))
{
sftp.Connect();
var fileList = sftp.ListDirectory("/Foldername");
foreach (var item in fileList)
{
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
using (XmlTextWriter writer = new XmlTextWriter(sw))
//reading files from MFT
using (XmlReader reader = XmlTextReader.Create(sftp.OpenRead(item.FullName)))
{
while (reader.Read())
{
if (reader.LocalName == "Employee" && reader.IsStartElement())
{
writer.WriteStartElement(
reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
}
}
}
sb = null;
// This line fails and I get "no such file" error message.
sftp.DeleteFile(item.FullName);
}
sftp.Disconnect();
}
但是如果我在读取文件后断开连接并再次连接我就可以删除文件。
此解决方法解决了问题:
sftp.Disconnect(); // If I disconnect and connect again, I am able to delete the file
sftp.Connect(); // Connecting again
sftp.DeleteFile(item.FullName); // Now delete file works
您没有关闭远程文件流,所以文件被锁定,无法删除。
试试这个:
using (var remoteFileStream = sftp.OpenRead(item.FullName))
using (XmlReader reader = XmlTextReader.Create(remoteFileStream))
{
// ...
}
XmlTextReader
似乎没有配置底层 Stream
。参见 Why is FileStream not closed by XmlReader。
我正在使用 Renci.SshNet 连接到 SFTP 并逐个循环浏览文件夹中的文件,并在读取文件后删除。然后我们继续下一个文件。但我观察到一个问题,我无法删除文件。当我尝试 sftp.DeleteFile(item.FullName);
时,它给出 “没有这样的文件” 错误消息。
下面是给出上述问题的示例代码。
using (SftpClient sftp = new SftpClient(con))
{
sftp.Connect();
var fileList = sftp.ListDirectory("/Foldername");
foreach (var item in fileList)
{
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
using (XmlTextWriter writer = new XmlTextWriter(sw))
//reading files from MFT
using (XmlReader reader = XmlTextReader.Create(sftp.OpenRead(item.FullName)))
{
while (reader.Read())
{
if (reader.LocalName == "Employee" && reader.IsStartElement())
{
writer.WriteStartElement(
reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
}
}
}
sb = null;
// This line fails and I get "no such file" error message.
sftp.DeleteFile(item.FullName);
}
sftp.Disconnect();
}
但是如果我在读取文件后断开连接并再次连接我就可以删除文件。
此解决方法解决了问题:
sftp.Disconnect(); // If I disconnect and connect again, I am able to delete the file
sftp.Connect(); // Connecting again
sftp.DeleteFile(item.FullName); // Now delete file works
您没有关闭远程文件流,所以文件被锁定,无法删除。
试试这个:
using (var remoteFileStream = sftp.OpenRead(item.FullName))
using (XmlReader reader = XmlTextReader.Create(remoteFileStream))
{
// ...
}
XmlTextReader
似乎没有配置底层 Stream
。参见 Why is FileStream not closed by XmlReader。