0

すべてのファイルを ftp にアップロードする際に問題があります: 私はftplibを使用しています。アップロードする機能があります:

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

サーバーには次のものがあります:

UPLOAD
--DIR1
----DIR3
------DIR2
--------DIR4
----------FILE7
--------FILE5
--------FILE6
------FILE4
----FILE3

最初のフォルダーにファイルがなく、ディレクトリ ツリーが間違っています。

4

3 に答える 3

2

さて、あなたの機能が問題です。フォルダーに入ってファイルをコピーすると、前のフォルダーに戻るのではなく、ツリーに深く入ります。

これに対する簡単な解決策は、この関数を書き直して、一度反復したディレクトリから戻るようにすることです。

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
  }

}
于 2013-02-02T13:24:38.203 に答える
1

はい、あなたが正しい。通話ごとに現在のディレクトリを保存して割り当てることができます。これを試して:

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, "/");
于 2013-02-02T13:24:17.933 に答える
0

このコーデいいなぁ

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);
    }
}
于 2013-02-02T14:50:18.993 に答える