【问题标题】:File to Zip Exists C#压缩文件存在 C#
【发布时间】:2018-07-14 12:03:38
【问题描述】:

我有许多大文件需要传输。当我将所有内容压缩成一个大文件时,我的 TX 程序一直挂起。所以我想压缩单个文件。

 namespace WindowsFormsApplication1
 {
  public partial class UncompressFolder : Form
  {
    public UncompressFolder()
    {
        InitializeComponent();
    }

    void ProcessFiles(string path, string choice="U")
    {
        string[] files;

        files = Directory.GetFiles(path);
        foreach (string file in files)
        {
            // Process each file
            if (!file.ToUpper().Contains("zip"))
            {
                FileInfo fi = new FileInfo(file);
                string startPath = fi.DirectoryName;
                string zipPath = fi.DirectoryName + @"\zipped\";
                string zipFile = zipPath + fi.Name+".zip";

                string extractPath = startPath + @"\unzipped";
                if (!Directory.Exists(extractPath))
                {
                    Directory.CreateDirectory(extractPath);
                }

                if (choice == "Z")
                {
                    // zip it --> always give me the "File's In Use Error"
                    // option I had tried but did not work  --> Directory.CreateDirectory(zipPath);
                    System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipFile);

                }
                else
                {// unzip -- works fine

                    System.IO.Compression.ZipFile.ExtractToDirectory(file, extractPath);
                }

            }

        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.folderBrowserDialog1.ShowDialog();
        ProcessFiles(folderBrowserDialog1.SelectedPath, "U");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.folderBrowserDialog1.ShowDialog();
        ProcessFiles(folderBrowserDialog1.SelectedPath,"Z");
    }
   }
 }

我看到有关人们压缩到他们现有文件的帖子,但我认为这不是我正在做的事情。如果有人能帮助我解决这个问题,我会非常高兴和感激。

【问题讨论】:

标签: c# zip


【解决方案1】:

将文件压缩到您正在压缩的同一文件夹中可能会导致引发此异常。尝试更改您的代码逻辑,以便在目标文件夹之外创建压缩文件:

// Exception
ZipFile.CreateFromDirectory(@"C:\MyPath", @"C:\MyPath\MyArchive.zip");

// No Exception
ZipFile.CreateFromDirectory(@"C:\MyPath", @"C:\MyOtherPath\MyArchive.zip");

避免使用奇怪的技巧,例如将目标文件夹复制到另一个位置并将该位置传递给 CreateFromDirectory 方法。这会大大降低速度并占用驱动器上不必要的空间,尤其是当您的文件夹包含大文件时。

附带说明,切勿通过连接字符串来手动更改目录路径。这有时会产生奇怪的结果。改用Path.Combine,它可以更好地在内部处理所有事情:

String zipPath = Path.Combine(fi.DirectoryName, @"\zipped\");

此外,重构您的代码,以便仅在需要特定操作时计算必要的路径。这将略微提高流程性能:

FileInfo fi = new FileInfo(file);
string startPath = fi.DirectoryName;

if (choice == "Z")
{
    string zipPath = fi.DirectoryName + @"\zipped\";
    string zipFile = zipPath + fi.Name+".zip";

    Directory.CreateDirectory(zipPath);
    ZipFile.CreateFromDirectory(startPath, zipFile);
}
else
{
    string extractPath = startPath + @"\unzipped";

    if (!Directory.Exists(extractPath))
        Directory.CreateDirectory(extractPath);

    ZipFile.ExtractToDirectory(file, extractPath);
}

【讨论】:

  • 我试过 string zipPath = fi.DirectoryName + @"\zipped\zipped\"; (注意文件夹中的文件夹)但这不起作用。也许是因为它是一个子文件夹?我会尝试您的建议并使用完全不同的文件夹。另外,感谢您的建议。 :)
  • 您仍在尝试打包在其内部创建 zip 的文件夹。根据答案,您必须使用完全不同的文件夹。
  • 啊——我现在看到了问题所在。我想要压缩单个文件并且系统想要压缩整个目录。有什么想法吗?
  • 去掉遍历文件的foreach逻辑,直接在目标目录调用ZipFile.CreateFromDirectory
  • 这将使每个文件成为单独的压缩文件?我不能只压缩文件夹,因为我无法传输这么大的文件夹。如果我为每个文件创建一个目录并将文件移动到该目录中会怎样?
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多