【问题标题】:How to remove "." and ".." files from remote directory with C# and WinSCP如何删除“。”和“..”来自远程目录的 C# 和 WinSCP 文件
【发布时间】:2015-12-29 20:36:37
【问题描述】:

我正在尝试使用 SFTP 连接从远程目录获取文件计数,但我得到了 ...,这些点像文件一样被计算在内,我在远程中有 2 个文件目录,但正在计算 4 个文件,包括 ...

有人可以帮我解决这个问题吗?

这是我的代码:

filesCount = session.ListDirectory(DataFile.sRemoteDirectory).Files.Count;                

谢谢!

【问题讨论】:

    标签: c# sftp winscp winscp-net


    【解决方案1】:

    根据the WinSCP documentation

    如果您愿意,可以使用Session.EnumerateRemoteFiles 方法:

    • 仅列出与通配符匹配的文件;
    • 递归列出文件;
    • 从列表中排除对此 (.) 和父 (..) 目录的引用。

    看来你应该改变你的代码来做更多这样的事情:

    filesCount = 0; 
    filesCount = session.EnumerateRemoteFiles(DataFile.sRemoteDirectory).Files.Count();                
    session.Close();
    

    【讨论】:

    • 我尝试了该选项,由于某种原因,当我执行会话时未显示 EnumerateRemoteFiles。
    • @JavierSalas 你是用大写还是小写的“session”?
    • EnumerateRemoteFiles 在当前稳定版本中尚不可用。 + 它返回IEnumerable<RemoteFileInfo>,所以你需要在返回值上调用.Count(),而不是.Files.Count
    【解决方案2】:

    您可以使用EnumerateRemoteFiles 而不是ListDirectory,它不会包含“..”和“.”

    “。”和“..”分别表示这个目录和父目录。

    【讨论】:

      【解决方案3】:

      ... 在大多数文件系统上分别是对此目录和父目录的引用。


      要过滤它们,您可以使用RemoteFileInfo class 的新属性.IsThisDirectory.IsParentDirectory

      filesCount =   
          session.ListDirectory(DataFile.sRemoteDirectory).Files
              .Where(file => !file.IsThisDirectory && !file.IsParentDirectory).Count();
      

      请注意,您必须使用Enumerable.Count() extension method,而不是ICollection.Count property,因为Enumerable.Where()IEnumerable,而不是Collection


      或者为了更简单,使用Session.EnumerateRemoteFiles() method,它与EnumerationOptions.None 选项在功能上等同于Session.ListDirectory(),只是它排除了...

      filesCount =
          session.EnumerateRemoteFiles(
              DataFile.sRemoteDirectory, null, EnumerationOptions.None).Count();
      

      如果要过滤所有目录,请使用:

      filesCount =   
          session.ListDirectory(DataFile.sRemoteDirectory).Files
              .Where(file => !file.IsDirectory).Count();               
      

      【讨论】:

        【解决方案4】:

        改用 session.EnumerateRemoteFiles。

        【讨论】:

          【解决方案5】:

          尽管命名,Files 集合不仅包含文件,还包含所有目录条目,包括当前和父目录引用。

          如果您只想计算文件,请按IsDirectory 属性过滤它们:

          var filesCount = session.ListDirectory(dir).Files.Where(x => !x.IsDirectory).Count();
          

          最新版本中还有IsParentDirectoryIsThisDirectory 属性来过滤“..”和“.”没有名称比较的案例。

          【讨论】:

          • 这不包括所有目录,而不仅仅是...。因此,虽然它可以工作,但如果没有其他目录,它并不能完全按照问题的要求进行。
          猜你喜欢
          • 1970-01-01
          • 2016-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多