簡體   English   中英

如何使用C#和WinSCP從遠程目錄中刪除“。”和“..”文件

[英]How to remove “.” and “..” files from remote directory with C# and WinSCP

我正在嘗試使用SFTP連接從遠程目錄中獲取文件數,但我得到了. ..這些點數像文件一樣,我在遠程目錄中有2個文件,但是計算4個文件,包括. ..

有人可以幫我解決這個問題嗎?

這是我的代碼:

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

謝謝!

根據WinSCP文檔

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

  • 僅列出與通配符匹配的文件;
  • 遞歸列出文件;
  • 從列表中排除對此(。)和父(...)目錄的引用。

因此,您似乎應該更改代碼以執行更多類似的操作:

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

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

“” 和“..”分別表示該目錄和父目錄。

. ..分別是在大多數文件系統上對this和parent目錄的引用。


要過濾它們,可以使用RemoteFileInfo類的新屬性.IsThisDirectory.IsParentDirectory

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

請注意,您必須使用Enumerable.Count()擴展方法 ,而不是ICollection.Count屬性,因為Enumerable.Where()的結果是IEnumerable ,而不是Collection


或者為了使它更容易,使用Session.EnumerateRemoteFiles()方法 ,它與EnumerationOptions.None選項在功能上等同於Session.ListDirectory() ,只是它排除了. ..

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

如果要篩選所有目錄,請使用:

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

請嘗試session.EnumerateRemoteFiles。

盡管命名,但Files集合不僅包含文件,還包含所有目錄條目,包括當前和父目錄引用。

如果您只想計算文件,請按IsDirectory屬性過濾它們:

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

在最新版本中還有IsParentDirectoryIsThisDirectory屬性來過濾“..”和“。”。 無名稱比較的案例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM