C# 跨多种方法共享 WINSCP.net 会话

问题描述 投票:0回答:1

我使用 WINSCP.net 在 C# 中编写了一个程序,它递归地搜索 SFTP 站点以查找特定的子文件夹模式,然后递归地枚举这些目录的内容。

程序可以运行,但是每个方法的前半部分都是一样的。会话设置和会话启动有太多样板文件。有没有一种方法可以只公开定义一次,然后从每个方法中引用会话?

感谢任何帮助。

using WinSCP;
 
class Sanity

{

   
    public static int Main()
    
    
    { 
        try
        {
            // Setup session options
           SessionOptions settings = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                HostName = "",
                UserName = "",
                Password = "",
                SshHostKeyFingerprint = ""
            };
             
            using (Session session = new Session())
            {
               
                session.Open(settings); // Connect
                
                string homeDir = "/something";

                RemoteDirectoryInfo directory = 
                    session.ListDirectory(homeDir);  // Set root location
                
                
                foreach (RemoteFileInfo file in directory.Files)  // Loop over the directories
                {                                      
                    LookDir(file.FullName);     // Pass each parent directory
                }

            }
 
            return 0;   
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e);
            return 1;
        }
    }


    public static void LookDir(string dir) // Searches for the Inbound folder
    
      
        {
        
            // Setup session options
            SessionOptions settings = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                HostName = "",
                UserName = "",
                Password = "",
                SshHostKeyFingerprint = ""
            };
 
            using (Session session = new Session())
            {
                // Connect
                session.Open(settings);
 
                RemoteDirectoryInfo directory = 
                    session.ListDirectory(dir);
                

                foreach (RemoteFileInfo file in directory.Files)
                {                                      
                    if (!file.FullName.Contains(".") && file.IsDirectory) {
                    
                       LookDir(file.FullName);  //Recursive

                        if (file.FullName.EndsWith("/Inbound")) {
                            
                            Console.WriteLine("Passing " + file.FullName + " for analysis");
                            FileCheck(file.FullName);  // Pass Inbound for enumeration

                        }
                    
                    } 
                
                }
                
            }

        }

    public static void FileCheck(string Nug) //Recursively checks the Inbound folder for files

    {

        SessionOptions settings = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                HostName = "",
                UserName = "",
                Password = "",
                SshHostKeyFingerprint = ""
            };
 
            using (Session session = new Session())
            {
                // Connect
                session.Open(settings);

                IEnumerable<RemoteFileInfo> fileInfos =
                    session.EnumerateRemoteFiles(Nug, "*", WinSCP.EnumerationOptions.AllDirectories);
            
                int count = fileInfos.Count();
            
                if (count > 0) {  

                    Console.WriteLine("It contains " + count + " files");
               
                }
             
            }
    }
}

        
        





我确实尝试将会话传递给类变量或参数,但出现错误。我实际上不确定我想要的是否可能。

c# sftp winscp winscp-net
1个回答
0
投票

如果你只想打开一次会话,使用这样的方法:

Session _session = null;

private Session GetSession()
{
    if (_session == null)
    {
        var settings = new SessionOptions
        {
            Protocol = Protocol.Sftp,
            HostName = "",
            UserName = "",
            Password = "",
            SshHostKeyFingerprint = ""
        };
 
        var session = new Session();
        session.Open();
        _session = session;
    }
    
    return _session;
}

但是您还需要确保

_session
在程序结束时被释放。而且你需要确保你永远不会尝试同时使用
_session
多次。


如果你只是想分解出

Session
的创作,见:
使用 ASP Session 变量创建 WinSCP SessionOptions,它可以在多个方法之间重复使用

© www.soinside.com 2019 - 2024. All rights reserved.