2013-03-11 6 views
1

Je dois créer un dossier dans l'amazon S3. Maintenant, doit convertir ce dossier dans le fichier zip. J'ai utilisé le DotNetZip Liberary pour convertir le fichier .zip. Voici le lien pour cetteCréer un dossier zip en 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); 
    } 
} 

Quand je lance le code, il montre l'erreur « Le format du chemin donné n'est pas pris en charge. »

Répondre

2

S3DirectoryInfo émule une structure de répertoire mais n'est pas une structure de répertoire réelle et DotNetZip ne sait pas comment gérer une chaîne pointant vers un objet dans S3. Pour ce faire, vous devrez télécharger les fichiers, les compresser, puis télécharger le fichier zip résultant. Voici un exemple de code qui montre comment vous pourriez faire cela.

 
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(); 
     } 
    } 
} 

}