【问题标题】:DotNetZip | C# Getting the extracted folder, not the .zip file that has just been unzipped?点网邮编 | C#获取提取的文件夹,而不是刚刚解压缩的.zip文件?
【发布时间】:2013-09-19 06:51:51
【问题描述】:

我目前有这个代码:

     foreach (string file in openFileDialog1.FileNames)
     {
     String ExtractPath = Path.GetDirectoryName(file);   
         try
         {
             using (ZipFile zip = ZipFile.Read(file))
             {
                 zip.ExtractProgress += ExtractProgress;
                 foreach (ZipEntry e in zip)
                 {
                     try
                     {                             
                         e.Extract(ExtractPath,ExtractExistingFileAction.OverwriteSilently);  // true => overwrite existing files
                      }
                      catch
                      {
                      }
                    }
                 }
            }
            catch
            {
            }
       }

这可以很好地同时提取一个或多个选定的 zip 文件。 但是我很困惑我应该如何为每个文件创建一个单独的目录并将每个文件放入创建的目录中。

例子:

用户选择 2 个 zip 文件进行解压。 这 2 个 zip 文件称为“A.zip”和“B.zip”

我想以编程方式将提取的文件放入它们自己的目录中,以便筛选它们以供进一步使用。

因此,将提取 zip 文件“A.zip”并将提取的文件放入名为“Unzipped A”的文件夹中,然后提取 zip 文件“B.zip”并将提取的文件放入文件夹中称为“解压 B”。

如果这令人困惑,我很抱歉。 非常感谢您的帮助。

好的,在使用和编辑了 MatteKarla 的 sn-ps 之后,我现在有了这个:

            foreach (string file in openFileDialog1.FileNames)
        {
            string directory = Path.GetDirectoryName(file) + @"\Unzipped " + Path.GetFileNameWithoutExtension(file);
            var GetFiles = Directory.GetFiles(directory, "*.txt", SearchOption.AllDirectories).Where(s => s.EndsWith(".txt"));
            foreach (string text in GetFiles)
            {
                MessageBox.Show("Text found", "File");
            }
        }

这会在我创建的目录中搜索提取的文件以查找 .txt 文件,并且效果很好,我只是想知道这是正确的方法还是有更有效的方法?

【问题讨论】:

  • 不熟悉,但是否需要获取 ZipEntry 的相对路径并将其与 ExtractPath 连接?
  • 感谢您的回复,问题是,在“foreach(openfiledialog1.filenames 中的字符串文件)”循环中收集的任何信息都无法使用,因为我需要对提取的文件进行筛选在该循环之外完成。
  • 您可以在提取时检查,ZipEntry 有一个FileName 属性。

标签: c# dotnetzip


【解决方案1】:

使用不带扩展名的文件名,您可以使用Path.GetFileNameWithoutExtensionPath.Combine 组合路径和不带扩展名的文件名来创建新路径。

最后只需使用Directory.CreateDirectory 创建该目录,这样当您尝试将 zip 文件解压缩到您的ExtractPath 时该目录就存在。

这会将所有的 zip 文件解压到被解压的 zip 文件所在的目录,通常使用 OpenFileDialog 时所有文件都在同一个目录中。

foreach (string file in openFileDialog1.FileNames)
 {
     String ExtractPath = Path.GetDirectoryName(file);   
     string directory = "Unzipped " + Path.GetFileNameWithoutExtension(file);
     ExtractPath = Path.Combine(ExtractPath, directory);
     Directory.CreateDirectory(ExtractPath);

     try
     {string ExtractPath = Path.GetDirectoryName(file);

如果您希望将所有文件提取到特定目录,则将目录设置在 for 循环之外,然后将该路径与“解压缩”+文件名结合起来。

String unpackPath = @"C:\UnpackPath";  
foreach (string file in openFileDialog1.FileNames)
 {
     string directory = "Unzipped " + Path.GetFileNameWithoutExtension(file);
     string ExtractPath = Path.Combine(unpackPath, directory);
     Directory.CreateDirectory(ExtractPath);

这将创建解压文件夹中的文件,例如:“C:\UnpackPath\Unzipped A”、“C:\UnpackPath\Unzipped B”(使用您的示例文件名)。

【讨论】:

  • 谢谢!,我已经完成了一半,现在“字符串目录=”解压缩“+ Path.GetFileNameWithoutExtension(file);”是我创建的目录的名称,我将如何在 ForEach 循环之外收集这些信息?
  • 编辑了我的原帖,请看一下好吗?谢谢你
【解决方案2】:

你可以使用.Net的

Directory.Create("url") ;

还有

Path.GetFileName("url"); // Separates the file name from the path

创建目录并获取需要存储在其中的文件名。

您可以动态创建目录,例如将压缩文件名传递给目录 + 有效路径,例如

GetCurrentDirectory () + zipped file name 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2021-08-09
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多