2017-06-12 9 views
0

Par exemple, si j'ai un dossier nommé 2016, et dans ce dossier sont les dossiers Jan-Dec et d'autres fichiers, y at-il un moyen de compresser ces dossiers ensemble en 2016.zip? Tout ce que j'ai essayé zips ensemble tous les fichiers dans le dossier, mais je veux zipper ensemble juste les dossiers et aucun autre fichier dans le dossier.Est-il possible de compresser des dossiers ensemble en C#?

Fondamentalement, ce serait 2016.zip avec Jan-Dec dossiers dans le 2016.zip avec chacun des dossiers ayant leurs fichiers respectifs dans eux, pas des dossiers vides dans le zip.

Le code suivant récupère les fichiers commençant par 00, mais pas les dossiers.

// Where the files are located 
string strStartPath = txtTargetFolder.Text; 

// Where the zip file will be placed 
string strZipPath = @"C:\Users\smelmo\Desktop\testFinish\" + strFileNameRoot + "_" + txtDateRange1.Text.Replace(@"/", "_") + "_" + txtDateRange2.Text.Replace(@"/", "_") + ".zip"; 

if(File.Exists(strZipPath)) 
{ 
    File.Delete(strZipPath); 
} 

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create)) 
{ 
    foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles()) 
    { 
       if (file.Name.StartsWith("00")) 
       { 
        var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name); 
       } 
    } 
} 

J'ai également essayé d'utiliser typeof() mais il ne saisit pas les dossiers, ou quoi que ce soit.

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create)) 
    { 
     foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles()) 
     { 
       Type t = file.GetType(); 
       if (t.Equals(typeof(Directory))) 
       { 
        var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name); 
       }    
    } 

EDIT: ajouté des détails pour plus de clarté

+0

Juste pour clarifier, vous voulez un zip de dossiers vides, non? –

+0

@ CodyG.No, les dossiers Jan-Dec contiennent des fichiers. Je voudrais zipper les dossiers Jan-Dec ensemble. Donc, l'ouverture de 2016.zip aurait des dossiers Jan-Dec et ensuite ces dossiers ayant leurs fichiers respectifs. – smelmo

+1

Pourquoi n'essayez-vous pas 'DirectoryInfo (strStartPath) .GetDirectories'? '.GetFiles()' ne retournera pas les répertoires ... –

Répondre

2

Avec la structure de dossier suivant:

enter image description here

Ce code (mise à jour):

using System.IO; 
using System.IO.Compression; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string sourceFolder = @"c:\temp"; 
     string zipFilePath = Path.Combine(sourceFolder, "test.zip"); 

     // TODO: Check if the archive exists maybe? 

     using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create)) 
     { 
      foreach (var directoryName in Directory.GetDirectories(sourceFolder)) 
      { 
       foreach (var filePath in Directory.GetFiles(directoryName)) 
       { 
        var dirInfo = new DirectoryInfo(directoryName); 
        var fileName = Path.GetFileName(filePath); 

        var entry = archive.CreateEntry($"{dirInfo.Name}\\{fileName}"); 
       } 
      } 
     } 
    } 
} 

produit ce zip :

enter image description here

+0

Mais si je voulais que le zip soit les dossiers au lieu des fichiers .txt, est-ce que je devrais enlever le dernier 'foreach' et créer l'entrée pour chaque nom de répertoire? – smelmo

+0

Je ne comprends pas exactement ce que vous voulez dire. Avez-vous seulement besoin d'un zip avec des dossiers vides Jan-Dec? –

+0

J'ai aussi essayé d'utiliser le code exact (en modifiant le dossier sourceFolder) et le zip est vide. – smelmo