需要在网络上传输超过3G的小文件

时间:2012-05-25 18:56:37

标签: c# networking directory compression

我需要在网络上传输大量小文件。我的文件总大小约为3G,将来会增长。我知道如果我在一个文件中传输文件(如winrar文件,winzip文件或7 zipfile),网络上的性能会更好,但我会在cpu时间后付费来压缩和解压缩文件。

有没有一种方法可以在c#中传输我的目录,只有一个文件可以使用winrar,winzip,7zip等第三方....

以最佳效果传输我的文件夹,子文件夹和文件的最佳方法是什么?

Rigth现在我使用自定义方法来执行此操作导致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);
          }
        }
      }
    }

1 个答案:

答案 0 :(得分:0)

像zip这样的存档格式比逐个文件传输有很多优点,特别是如果你处理成千上万的小文件。首先,zip已完全调试。您不必担心像空文件或目录这样的边缘情况。另一方面,通过网络传输几个大文件所需的开销远远少于传输大量小文件。

在获取文件的文件系统和接收文件的文件系统上,每个文件都有很多开销。除非您创建文件系统(当您可以设置适当的块和簇大小时),否则您无法对此开销执行任何操作。

在程序中使用DotNetZip等归档软件包可能有所帮助。您将能够在程序的控制下编写,然后读取zip文件。看看这个。 http://www.codeproject.com/Articles/181291/DotNetZip。 Sharpziplib也是一种可能性。

但是,您可能希望使用像rsync这样的工具。这是专为您正在进行的操作而构建的,并且已完全调试。 http://en.wikipedia.org/wiki/Rsync