gpt4 book ai didi

c# - 使用 ssh.net 在 ubuntu 服务器上的文件末尾写入

转载 作者:行者123 更新时间:2023-12-04 18:43:58 31 4
gpt4 key购买 nike

我想在 \etc\ssh\sshd_config 中添加一些行使用 ssh.net,我试过这个方法SFTPCLient.WriteAllLines(string path, string[] content)但它添加了 content在删除相同行数后的文件开头。在文档中我发现了这个 It is not first truncated to zero bytes.这是什么意思?
我也试过这个方法public abstract void Write(byte[] buffer, int offset, int count); 与另一个文件,因为我不想冒险删除其他行,但它不起作用,谁能解释偏移量和计数必须采用的值?

string[] config = {"Match user Fadwa", "ChrootDirectory /fadwa/dhifi/test",
"ForceCommand internal-sftp -d /fadwa"};

byte[] bconfig = config.SelectMany(s =>Encoding.UTF8.GetBytes(s +
Environment.NewLine)).ToArray();
Renci.SshNet.Sftp.SftpFileStream stream = sftpClient.OpenWrite("/sftp/dhifi/test.txt");
if (stream.CanWrite)
{
stream.Write(bconfig,0,bconfig.Length);
}
else Console.WriteLine("Can't Write right now ! ");
否则,欢迎任何其他解决方案,在此先感谢!

最佳答案

SftpClient.OpenWrite() creates a Stream 位于文件的开头。 “它不是首先被截断为零字节”意味着 Stream不会写入有效的空文件,而是覆盖文件的现有字节。因此,如果现有文件长于 content SftpFileStream.Write()的参数,生成的文件将包含 content其次是现有文件的其余部分,这正是您所观察到的。
the documentation我看到了一些解决方案:

  • SftpClient.AppendAllLines() :
    sftpClient.AppendAllLines("/sftp/dhifi/test.txt", config);
  • SftpClient.AppendText() :
    using (StreamWriter writer = sftpClient.AppendText("/sftp/dhifi/test.txt"))
    foreach (string line in config)
    writer.WriteLine(line);
  • 由于您想在文件末尾开始写入,而不是 SftpClient.OpenWrite()您可以调用SftpClient.Open() ,它允许您指定 FileMode Append :
    using (SftpFileStream stream = sftpClient.Open("/sftp/dhifi/test.txt", FileMode.Open | FileMode.Append))
    stream.Write(bconfig, 0, bconfig.Length);
    我不相信你对 CanWrite 的检查是必要的,因为 Stream如果 FileAccess.Write 应该首先无法打开不能被授予。
    如果 FileMode.Append出于某种原因不适用于 SSH.NET(看起来确实如此,因为那是 what AppendText() uses )您可以改用 @jdweng's suggestion并在写入文件之前查找文件末尾:
    using (SftpFileStream stream = sftpClient.OpenWrite("/sftp/dhifi/test.txt"))
    {
    stream.Seek(0, SeekOrigin.End);
    stream.Write(bconfig, 0, bconfig.Length);
    }

  • 顺便说一句,注入(inject) NewLine 的另一种方法在您的 config 之间线条将是...
    byte[] bconfig = Encoding.UTF8.GetBytes(
    string.Join(Environment.NewLine, config)
    );
    这会更短更有效,因为它减少了中间 string 的数量。 s 和 byte[] s。

    关于c# - 使用 ssh.net 在 ubuntu 服务器上的文件末尾写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62519073/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com