-1

ネットワーク上でたくさんの小さなファイルを転送する必要があります。私のファイルの合計サイズは約 3G で、今後さらに大きくなります。ファイルを 1 つのファイル (winrar ファイル、winzip ファイル、または 7 zip ファイル) のように転送すると、ネットワーク上でのパフォーマンスが向上することはわかっていますが、後でファイルを圧縮および解凍するための CPU 時間を支払うことになります。

winrar、winzip、7zipなどのサードパーティを使用せずに、ディレクトリを1つのファイルだけに転送するC#の方法はありますか....

フォルダ、サブフォルダ、およびファイルを最高のパフォーマンスで転送する最良の方法は何ですか?

今、カスタムメソッドを使用してそれを行うと、Directory.Move問題が発生します

私の実際の方法がありますが、おそらく最もパフォーマンスの高い転送方法ではないことはわかっています。なにか提案を ?

質問は :

c# のネットワーク共有で、圧縮と解凍 (必要な場合) を含むすべてのディレクトリとファイルをより優れたパフォーマンスで転送するにはどうすればよいですか?

private void CopyDirectory(string source, string destination)
    {
      string[] files;


      if (!Directory.Exists(destination)) DirectoryHelper.CreateDirectoriesFromPath(destination);

      files = Directory.GetFileSystemEntries(source);

      foreach (string fileElement in files)
      {
        if (Directory.Exists(fileElement))
        {
          if (!ExcludedDirectoryName.Contains(Path.GetFileNameWithoutExtension(fileElement)))
          {
            CopyDirectory(fileElement, Path.Combine(destination, Path.GetFileName(fileElement)));
          }
        }
        else
        {
          try
          {
            // Valide si le fichier fait partie de la liste d'exclusion
            if (!ExcludedDirectoryName.Contains(Path.GetFileNameWithoutExtension(fileElement)))
            {
              // Calcule le Path de destination
              string destinationFile = Path.Combine(destination, Path.GetFileName(fileElement));

              // Valide si le fichier existe
              if (FileHelper.Exist(destinationFile))
              {
                // Supprime le fichier
                File.Delete(destinationFile);
              }

              // Copie le nouveau fichier
              File.Copy(fileElement, destinationFile, true);
            }
          }
          catch (IOException ioEx)
          {


            // Log l'exception
            ExceptionLogger.Publish(ioEx);
          }
        }
      }
    }
4

1 に答える 1

0

zip のようなアーカイブ形式には、ファイルごとの転送よりも多くの利点があります。特に、何万もの小さなファイルを処理している場合はなおさらです。1 つには、zip は完全にデバッグされています。空のファイルやディレクトリなどの特殊なケースについて心配する必要はありません。もう 1 つの理由として、ネットワーク経由でいくつかの大きなファイルを転送すると、小さなファイルをたくさん転送するよりもオーバーヘッドがはるかに少なくなります。

ファイルを取得するファイル システムとファイルを受け取るファイル システムの両方で、ファイルごとに多くのオーバーヘッドが発生します。ファイル システムを作成するとき (適切なブロックとクラスタ サイズを設定できるとき) を除いて、このオーバーヘッドに対してできることは何もありません。

プログラム内で DotNetZip のようなアーカイブ パッケージを使用すると役立つ場合があります。プログラムの制御下で、zip ファイルの書き込みと読み取りを行うことができます。見てみな。 http://www.codeproject.com/Articles/181291/DotNetZip。Sharpziplib も可能です。

ただし、rsync などのツールの使用を検討することをお勧めします。これはあなたがやっていることのために構築されたものであり、完全にデバッグされています。 http://en.wikipedia.org/wiki/Rsync

于 2012-05-25T19:30:00.793 に答える