SSH.NET SFTP 递归获取目录和文件列表

2023-12-31

我正在使用 Renci.SshNet 库通过 SFTP 递归获取文件和目录列表。我可以连接 SFTP 站点,但我不确定如何在 C# 中递归获取目录和文件列表。我还没有找到任何有用的例子。

有人尝试过这个吗?如果是这样,您可以发布一些有关如何递归获取这些文件和文件夹的示例代码吗?

Thanks,
Prav


这个库有一些怪癖,使得这个递归列表变得棘手,因为ChangeDirectory and ListDirectory不按您的预期工作。

下面的做法是not列出 /home 目录中的文件,而不是列出 /(根)目录中的文件:

sftp.ChangeDirectory("home");
sftp.ListDirectory("").Select (s => s.FullName);

下面的做法是not工作并返回 SftpPathNotFoundException:

sftp.ChangeDirectory("home");
sftp.ListDirectory("home").Select (s => s.FullName);

以下是列出/home目录下文件的正确方法

sftp.ChangeDirectory("/");
sftp.ListDirectory("home").Select (s => s.FullName);

如果你问我的话,这真是太疯狂了。设置默认目录ChangeDirectory方法没有影响ListDirectory方法,除非您在此方法的参数中指定文件夹。看来应该为此编写一个错误。

因此,当您编写递归函数时,您必须设置一次默认目录,然后更改ListDirectory当您迭代文件夹时调用。该列表返回 SftpFiles 的枚举。然后可以单独检查这些IsDirectory == true。请注意,列表还会返回. and ..条目(目录)。如果您想避免无限循环,则需要跳过这些。 :-)

编辑 2018 年 2 月 23 日

我正在审查我的一些旧答案,并想为上面的答案道歉并提供以下工作代码。请注意,此示例不需要ChangeDirectory,因为它使用的是Fullname为了ListDirectory:

void Main()
{
    using (var client = new Renci.SshNet.SftpClient("sftp.host.com", "user", "password"))
    {
        var files = new List<String>();
        client.Connect();
        ListDirectory(client, ".", ref files);
        client.Disconnect();
        files.Dump();
    }
}

void ListDirectory(SftpClient client, String dirName, ref List<String> files)
{
    foreach (var entry in client.ListDirectory(dirName))
    {

        if (entry.IsDirectory)
        {
            ListDirectory(client, entry.FullName, ref files);
        }
        else
        {
            files.Add(entry.FullName);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSH.NET SFTP 递归获取目录和文件列表 的相关文章

  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • .net 运行时 - Silverlight 运行时 =?

    我用 google 搜索了一下 但没能找到 net CLR 中的哪些类未包含在 CoreCLR 又名 Silverlight 中的详细列表 Windows net Framework 中缺少什么 Silverlight 另外 是否存在 Si
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • 防止复制构造和返回值引用的分配

    如果我有一个函数返回对类实例的引用 但我无法控制其源 比如说list
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 删除对象时指针自动指向空

    假设我有一个对象和其他几个不同类类型的对象中的 10 个指向它的指针 如果对象被删除 这些指针必须设置为空 通常我会将对象的类与具有指向它的指针的类互连 以便它可以通知它们它正在被删除 并且它们可以将它们的指针设置为空 但这也有一个负担 即
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015

随机推荐

  • 如何使用 sympy 定义条件函数?

    我希望能够定义一个表达式 该表达式获取定义变量的所有值并将表达式计算为0当它没有定义时 与此类似 import numpy as np import sympy as sp def expr k1 k2 x y sp symbols x y
  • VB.NET - 计算两个日期之间的天数(排除)

    我正在尝试计算两个日期之间的天数 不包括星期六 and Sundays 到目前为止我已经写了这段代码 Dim startDay As Integer Dim endDay As Integer Dim days As Integer Dim
  • Elastic Search 匹配短语查询 -> 输出不可预测

    示例文档 id 5 title Quick Brown fox jumps over the lazy dog genre fiction Mapping movies mappings properties genre type text
  • Jupyter Notebook 和之前的输出

    有什么方法可以在不重新运行程序的情况下查看以前的输出吗 例如 我让机器学习算法过夜 早上我就得到了结果 但是 由于某种原因 当我在原始代码上按 Enter 时 它再次开始运行 原始输出消失了 输出存在于特定的上下文中 即单元 并且只要内核仍
  • 什么事件捕获 DataGridViewCell 中组合框中的值更改?

    我想在 a 中的值发生更改时处理该事件ComboBox in a DataGridView cell 有的是CellValueChanged事件 但直到我单击事件内的其他位置后 该事件才会触发DataGridView 一个简单的ComboB
  • ggplot:同时通过“geom_rect”排列因子顺序并突出显示区域

    首先 指定分类变量顺序的方法ggplot是重新排序它的级别data frame 其次 要在我们可以使用的任何绘图上突出显示一个区域geom rect 这里需要注意的是 不要将数据传递给geom rect 否则它不允许我们设置alpha 因此
  • 在 Haskell 中操作元组

    我是 Haskell 的新手 我有一个关于元组的问题 难道就没有遍历元组的方法吗 我知道使用列表进行遍历非常容易 但是如果输入作为元组给出 是否没有办法像使用列表一样检查整个元组 如果不是这种情况 是否可以将元组中的值提取到列表中并以这种方
  • 全屏纹理 iPhone OpenGL ES

    我知道 iPhone 上的 OpenGL 纹理需要是 2 的幂 OpenGL 2 0 也是如此吗 如果我有一个尺寸为 320 x 480 的图像并且想要将其全屏绘制 是否有任何可能的方法可以使用 OpenGL 来完成此操作 Thanks N
  • 如何使用 async/await 在 Node.js 中异步创建ReadStream

    我在使用时遇到困难fs creadReadStream异步处理我的 csv 文件 async function processData row perform some asynchronous function await someAsy
  • 二分查找条件中何时使用“=”?

    我对何时使用的场景感到很困惑 在二分查找中 例如 这是我从 wiki 中找到的 其中使用 while imin lt imax int binary search int A int key int imin int imax contin
  • ios 设置包中的简单标题输出

    我只想在设置文件中输出我的 ios 应用程序的版本号 我知道我必须将设置文件添加到应用程序文件夹中 当我构建并运行时 我可以看到标准设置包附带的 4 个设置 为了获得一个简单的只读字符串 我将第二个值更改为以下 在代码 didFinishL
  • 检查一个列表是否包含另一个列表中的元素

    我有两个列表 其中包含不同的对象 List
  • 如何使用具有不同对象的“repeating:count:”来初始化数组? [复制]

    这个问题在这里已经有答案了 令人惊讶的是 下面的代码打印SAME而初始化程序应该调用Z 每次构造函数 如何使用此方法与不同的实例初始化数组Z import Foundation class Z var i Int 0 var z Z Z r
  • 英特尔 XDK:将您的移动应用连接到数据库

    我目前正在开发一个应用程序 如果我没有数据库 构建后的应用程序将会很重 如何将应用程序连接到本地或远程数据库 提前致谢 您可以使用以下方法之一来使用数据库 1 使用 HTML5 客户端数据库 HTML5 在本地客户端计算机上提供四种不同类型
  • 如何在交互式会话中重置下划线? [复制]

    这个问题在这里已经有答案了 我已经覆盖了下划线变量 在Python交互式解释器中 如何在不重新启动解释器的情况下使下划线再次工作 del 一个全球性的 shadows https en wikipedia org wiki Variable
  • 如何在 PHP 中使用 SerializeArray 值?

    我从表单中获得了调整大小 resize resize form serializeArray 我把调整大小放在隐藏中并将其发送到php页面 如何在php中获取调整大小值
  • React-Bootstrap / React-Router-Bootstrap 中导航栏品牌的最佳实践

    存在关于锚标记的问题反应引导 and 反应路由器 我很好奇其他人是如何处理这种情况的 可以只留下带有 href 的锚标记 例如 a href Site Title a 并避免使用IndexLinkContainer 还有使用MenuItem
  • 将错误消息设置为英语不起作用

    由于某种原因 我无法更改 PostgreSQL 错误消息的语言 我尝试在脚本内设置语言以在第一行创建架构 SET lc messages TO en US UTF 8 我也做了this https stackoverflow com que
  • 序列化修改记录时,belongsTo 承诺未解决

    好的 必填信息 DEBUG DEBUG Ember 1 3 1 DEBUG Ember Data 1 0 0 beta 7 f87cba88 DEBUG Handlebars 1 0 0 DEBUG jQuery 1 10 2 DEBUG
  • SSH.NET SFTP 递归获取目录和文件列表

    我正在使用 Renci SshNet 库通过 SFTP 递归获取文件和目录列表 我可以连接 SFTP 站点 但我不确定如何在 C 中递归获取目录和文件列表 我还没有找到任何有用的例子 有人尝试过这个吗 如果是这样 您可以发布一些有关如何递归