C# 如何使用ftplib将目录上载到ftp?

C# 如何使用ftplib将目录上载到ftp?,c#,asp.net,.net,wpf,asp.net-mvc,C#,Asp.net,.net,Wpf,Asp.net Mvc,我无法将所有文件上载到ftp:我使用。 我有一个上传功能: static void DirSearch(string sDir, FtpConnection ftp) { try { foreach (string d in Directory.GetDirectories(sDir)) { string dirname = new DirectoryInfo(d).Name; if (!ftp.DirectoryExists(dirname))

我无法将所有文件上载到ftp:我使用。 我有一个上传功能:

static void DirSearch(string sDir, FtpConnection ftp)
{
  try
  {
    foreach (string d in Directory.GetDirectories(sDir))
    {
      string dirname = new DirectoryInfo(d).Name;
      if (!ftp.DirectoryExists(dirname))
      {
        ftp.CreateDirectory(dirname);
      }
      ftp.SetCurrentDirectory(dirname);
      foreach (string f in Directory.GetFiles(d))
      {
        Uri uri = new Uri(f);            
        ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));

      }
      DirSearch(d, ftp);
    }
  }
  catch (System.Exception e)
  {
    MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
  }
}
确定此功能可加载文件,但我有本地光盘文件:

UPLOAD
--DIR1
----DIR3
------FILE4
----FILE3
--DIR2
----DIR4
------FILE7
----FILE5
----FILE6
--FILE1
--FILE2
在serwer,我有:

UPLOAD
--DIR1
----DIR3
------DIR2
--------DIR4
----------FILE7
--------FILE5
--------FILE6
------FILE4
----FILE3
我在第一个文件夹中没有文件,目录树是错误的
我认为foult在ftp.SetCurrentDirectory(dirname)行中

是的,你说得对。您可以在每次通话时保存和分配当前目录。试试这个:

static void DirSearch(string sDir, FtpConnection ftp, string currentDirectory)
{
  try
  {
    ftp.SetCurrentDirectory(currentDirectory);
    foreach (string d in Directory.GetDirectories(sDir))
    {
      string dirname = new DirectoryInfo(d).Name;
      if (!ftp.DirectoryExists(dirname))
      {
        ftp.CreateDirectory(dirname);
      }      
      foreach (string f in Directory.GetFiles(d))
      {
        Uri uri = new Uri(f);            
        ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));

      }
      string newCurrentDir = currentDirectory + dirname + "/";
      DirSearch(d, ftp, newCurrentDir);
    }
  }
  catch (System.Exception e)
  {
    MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
  }
}
和方法调用

DirSearch("your initial dir", your ftp connection, "/");

是的,你说得对。您可以在每次通话时保存和分配当前目录。试试这个:

static void DirSearch(string sDir, FtpConnection ftp, string currentDirectory)
{
  try
  {
    ftp.SetCurrentDirectory(currentDirectory);
    foreach (string d in Directory.GetDirectories(sDir))
    {
      string dirname = new DirectoryInfo(d).Name;
      if (!ftp.DirectoryExists(dirname))
      {
        ftp.CreateDirectory(dirname);
      }      
      foreach (string f in Directory.GetFiles(d))
      {
        Uri uri = new Uri(f);            
        ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));

      }
      string newCurrentDir = currentDirectory + dirname + "/";
      DirSearch(d, ftp, newCurrentDir);
    }
  }
  catch (System.Exception e)
  {
    MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
  }
}
和方法调用

DirSearch("your initial dir", your ftp connection, "/");

好吧,你的功能就是问题所在——当你进入文件夹并将文件复制到其中时,你不会返回到上一个文件夹,而是会更深入到树中

简单的解决方案是重写此函数,使其在遍历目录后返回:

static void DirSearch(string sDir, FtpConnection ftp)
{
  try
  {
     // First, copy all files in the current directory
     foreach (string f in Directory.GetFiles(d))
     {
       Uri uri = new Uri(f);            
       ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));
     }

    // For all directories in the current directory, create directory if there is
    // no such, and call this function recursively to copy files.

    foreach (string d in Directory.GetDirectories(sDir))
    {
      string dirname = new DirectoryInfo(d).Name;
      if (!ftp.DirectoryExists(dirname))
      {
        ftp.CreateDirectory(dirname);
      }
      ftp.SetCurrentDirectory(dirname);
      DirSearch(d, ftp);
    }



  }
  catch (System.Exception e)
  {
    MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
  }
  finally{
     // Go back! 
     ftp.SetCurrentDirectory(".."); //untested, but it should be fine, as I don't see cdup command in ftplib
  }

}

好吧,你的功能就是问题所在——当你进入文件夹并将文件复制到其中时,你不会返回到上一个文件夹,而是会更深入到树中

简单的解决方案是重写此函数,使其在遍历目录后返回:

static void DirSearch(string sDir, FtpConnection ftp)
{
  try
  {
     // First, copy all files in the current directory
     foreach (string f in Directory.GetFiles(d))
     {
       Uri uri = new Uri(f);            
       ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));
     }

    // For all directories in the current directory, create directory if there is
    // no such, and call this function recursively to copy files.

    foreach (string d in Directory.GetDirectories(sDir))
    {
      string dirname = new DirectoryInfo(d).Name;
      if (!ftp.DirectoryExists(dirname))
      {
        ftp.CreateDirectory(dirname);
      }
      ftp.SetCurrentDirectory(dirname);
      DirSearch(d, ftp);
    }



  }
  catch (System.Exception e)
  {
    MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
  }
  finally{
     // Go back! 
     ftp.SetCurrentDirectory(".."); //untested, but it should be fine, as I don't see cdup command in ftplib
  }

}
这个代码很好

static void DirSearch(string sDir, FtpConnection ftp, string currentDirectory)
{
    try
    {
        ftp.SetCurrentDirectory(currentDirectory);
        foreach (string f in Directory.GetFiles(sDir))
        {
            Uri uri = new Uri(f);
            ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));

        }
        foreach (string d in Directory.GetDirectories(sDir))
        {
            ftp.SetCurrentDirectory(currentDirectory);
            string dirname = new DirectoryInfo(d).Name;
            if (!ftp.DirectoryExists(dirname))
            {
                ftp.CreateDirectory(dirname);
            }

            string newCurrentDir = currentDirectory + "/" + dirname ;
            DirSearch(d, ftp, newCurrentDir);
        }
    }
    catch (System.Exception e)
    {
        MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}
这个代码很好

static void DirSearch(string sDir, FtpConnection ftp, string currentDirectory)
{
    try
    {
        ftp.SetCurrentDirectory(currentDirectory);
        foreach (string f in Directory.GetFiles(sDir))
        {
            Uri uri = new Uri(f);
            ftp.PutFile(f, System.IO.Path.GetFileName(uri.LocalPath));

        }
        foreach (string d in Directory.GetDirectories(sDir))
        {
            ftp.SetCurrentDirectory(currentDirectory);
            string dirname = new DirectoryInfo(d).Name;
            if (!ftp.DirectoryExists(dirname))
            {
                ftp.CreateDirectory(dirname);
            }

            string newCurrentDir = currentDirectory + "/" + dirname ;
            DirSearch(d, ftp, newCurrentDir);
        }
    }
    catch (System.Exception e)
    {
        MessageBox.Show(String.Format("Błąd FTP: {0} {1}", e.Message), "Błąd wysyłania plików na FTP", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}