2013-03-11 3 views
1

Мне нужно создать папку на амазонке S3. Теперь нужно преобразовать эту папку в zip-файл. Я использовал DotNetZip Liberary для преобразования в ZIP-файл. Вот ссылка для этогоСоздать zip-папку в amazon S3

http://dotnetzip.codeplex.com/wikipage?title=CS-Examples

public void ConvertToZip(string directoryToZip, string zipFileName) 
{ 
    try 
    { 

     using (client = DisposableAmazonClient()) 
     { 
      var sourDir = new S3DirectoryInfo(client, bucket, directoryToZip); 

      var destDir = new S3DirectoryInfo(client, bucket, CCUrlHelper.BackupRootFolderPhysicalPath); 

      using (var zip = new ZipFile()) 
      { 
       zip.AddDirectory(sourDir.FullName); // recurses subdirectories 
       zip.Save(Path.Combine(destDir.FullName, zipFileName)); 
      } 
     } 

     logger.Fatal("Successfully converted to Zip."); 
    } 
    catch (Exception ex) 
    { 
     logger.Error("Error while converting to zip. Error : " + ex.Message); 
    } 
} 

Когда я запускаю код он показывает ошибку «формат данного пути не поддерживается.»

ответ

2

S3DirectoryInfo эмулирует структуру каталогов, но это не настоящая структура каталогов, а DotNetZip не знает, как обрабатывать строку, указывающую на объект в S3. Чтобы сделать это, вам нужно будет загрузить файлы, закрепить их, а затем загрузить полученный zip-файл. Вот пример кода, который показывает, как вы могли это сделать.

 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var zipFilename = @"c:\temp\data.zip"; 
     var client = new AmazonS3Client(); 
     S3DirectoryInfo rootDir = new S3DirectoryInfo(client, "norm-ziptest"); 
     using (var zip = new ZipFile()) 
     { 
      zip.Name = zipFilename; 
      addFiles(zip, rootDir, ""); 
     }

// Move local zip file to S3 
    var fileInfo = rootDir.GetFile("data.zip"); 
    fileInfo.MoveFromLocal(zipFilename); 
} 

static void addFiles(ZipFile zip, S3DirectoryInfo dirInfo, string archiveDirectory) 
{ 

    foreach (var childDirs in dirInfo.GetDirectories()) 
    { 
     var entry = zip.AddDirectoryByName(childDirs.Name); 
     addFiles(zip, childDirs, archiveDirectory + entry.FileName); 
    } 

    foreach (var file in dirInfo.GetFiles()) 
    { 
     using (var stream = file.OpenRead()) 
     {      
      zip.AddEntry(archiveDirectory + file.Name, stream); 

      // Save after adding the file because to force the 
      // immediate read from the S3 Stream since 
      // we don't want to keep that stream open. 
      zip.Save(); 
     } 
    } 
} 

}