C#使用SSH.NET连接Linux SFTP时远程路径配置疑问
问题解答
正确的远程路径设置
Linux服务器上的volume1/TestFile需要使用绝对路径,也就是在路径前加上根目录的斜杠,所以正确的NasFolderPath应该是:
string NasFolderPath = "/volume1/TestFile";
原因是SFTP连接默认会进入当前用户的主目录(比如/home/test),如果直接写volume1/TestFile,程序会去/home/test/volume1/TestFile查找,而这个路径不存在,所以必须用绝对路径指定根目录下的目标文件夹。
代码中的其他问题
- 冗余的连接创建:你同时初始化了
SshClient和SftpClient,其实可以直接用SftpClient的构造函数建立连接,无需先创建SshClient,既简化代码又节省资源:using (var sftp = new SftpClient(hostname, 22, username, password)) { sftp.Connect(); // 后续SFTP操作 sftp.Disconnect(); } - 日志描述错误:循环中
if (!file.IsDirectory)的日志是"HaveDirectory",这和逻辑矛盾(当前判断的是不是目录,也就是找到文件),应该修改为符合逻辑的描述,比如"Found file: " + file.Name。 - 未检查本地目录是否存在:如果
localFilePath对应的C:\test\目录不存在,File.Create会抛出异常,建议在创建文件流前先确保目录存在:if (!Directory.Exists(localFilePath)) { Directory.CreateDirectory(localFilePath); } - 无效的日志输出:
LogWriter.LogWrite("ConnectFolder" + files);直接拼接files对象会输出类型名称而非有效信息,建议修改为:LogWriter.LogWrite($"Connected to folder, found {files.Count()} items"); - 异常信息不够详细:当前只打印了异常的
Message,建议添加StackTrace方便排查深层问题:LogWriter.LogWrite($"An error occurred: {ex.Message}\nStack Trace: {ex.StackTrace}"); - 资源释放优化:可以用
using语句包裹SftpClient,无需手动调用Disconnect(),using会自动释放资源,更安全可靠。
内容的提问来源于stack exchange,提问作者pluto_99
相关产品推荐
相关产品推荐

