使用 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