【问题标题】:How to overwrite extracted zip file in C#, WinForms?如何在 C#、WinForms 中覆盖提取的 zip 文件?
【发布时间】:2013-06-23 09:41:11
【问题描述】:

我有这段代码在 C# 中使用 MS Access 作为其数据库进行备份和恢复。我完成了 zip 格式的备份,现在我想恢复 Zipped 文件。任何帮助都感激不尽。

public void BackupDatabase(string dateToday)
    {

        string dbFileName = "dbCPS.accdb";
            string CurrentDatabasePath = Path.Combine(Environment.CurrentDirectory , dbFileName);
            string backTimeStamp = Path.GetFileNameWithoutExtension(dbFileName) + "_" + dateToday + ".zip";// +Path.GetExtension(dbFileName);
            string destFileName = backTimeStamp;// +dbFileName;
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            if (fbd.ShowDialog() == DialogResult.OK)
            {
                string PathtobackUp = fbd.SelectedPath.ToString();
                destFileName = Path.Combine(PathtobackUp, destFileName);

                //File.Copy(CurrentDatabasePath, destFileName, true);
                using (var zip = new ZipFile())
                {
                    zip.AddFile(dbFileName);
                    zip.Save(destFileName);
                }
                MessageBox.Show("Backup successful! ");                  
            }            
    }

private void backupToolStripMenuItem1_Click(object sender, EventArgs e)
    {            
        BackupDatabase(DateTime.Now.ToString("ddMMMyyyy_HH.mm"));
    }


public void RestoreDatabase(string restoreFile)
    {
        string dbFileName = "dbCPS.accdb";
        string pathBackup = restoreFile;
        string CurrentDatabasePath = Path.Combine(Environment.CurrentDirectory, dbFileName);
        File.Copy(pathBackup, CurrentDatabasePath, true);
        MessageBox.Show("Restore successful! "); 
    }

private void restoreToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {                
            openFileDialogBackUp.FileName = "dbCPS";
            openFileDialogBackUp.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + @"Sauvegardes";
            if (openFileDialogBackUp.ShowDialog() == DialogResult.OK)
                RestoreDatabase(openFileDialogBackUp.FileName);
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }

此代码提取压缩文件,但我不知道如何同时进行还原。

        using (ZipFile zip = ZipFile.Read(restoreFile))
        {
            zip.ExtractAll(CurrentDatabasePath);
        }

【问题讨论】:

  • 您是否试图覆盖您的程序使用的开放数据库?或者只是找到正确的目标路径并将提取的文件覆盖前一个的问题?
  • @Steve 是的,我正在尝试覆盖打开的数据库。因为它的功能是恢复。
  • 如果我要恢复 .accdb 文件,代码可以正常工作,但是当我恢复 zip 文件时,出现错误。我认为这意味着我需要先提取才能使用此代码“File.Copy(pathBackup, CurrentDatabasePath, true);”。我使用此代码时的错误是代码“使用(ZipFile zip = ZipFile.Read(restoreFile)){ zip.ExtractAll(CurrentDatabasePath); }”是文件已打开,所以我无法覆盖?
  • 您使用什么库或参考来使用 ZipFile 函数?我在任何地方都找不到这个。
  • @Meta 你找到了吗?它的 Ionic.Zip。抱歉回复晚了。

标签: c# winforms extract restore zipfile


【解决方案1】:

我做到了!对于那些需要代码的人,这里是:

using (ZipFile zip = ZipFile.Read(pathBackup))
        {
            zip.ExtractAll(Environment.CurrentDirectory, ExtractExistingFileAction.OverwriteSilently);                
        }

【讨论】:

    【解决方案2】:

    您在使用数据库时不能直接覆盖它。
    主动我的意思是您在该数据库上打开了OleDbConnection

    从您上面的代码中无法了解您是否处于这种情况,因此首先要做的是搜索所有出现的 OleDbConnection 并检查它们是否正确关闭。如果您有一个全局 OleDbConnection 在应用程序的生命周期内保持打开状态(一种非常糟糕的做法),那么您需要在尝试覆盖 accdb 文件之前关闭它

    public void RestoreDatabase(string restoreFile)
    {
        string dbFileName = "dbCPS.accdb";
        string extractedFile = Path.GetTempFileName();
        string CurrentDatabasePath = Path.Combine(Environment.CurrentDirectory, dbFileName);
        using (ZipFile zip = ZipFile.Read(restoreFile))
        {
            // Extract to a temporary name built by the Framework for you....
            zip.ExtractAll(extractedFile);
        }
    
        // Now, before copying over the accdb file, you need to be sure that there is no
        // open OleDbConnection to this file, otherwise the IOException occurs because you
        // cannot change that file while it is actively used by a OleDbConnection
    
        // something like global_conn.Close(); global_conn.Dispose();
    
        File.Copy(extractedFile, CurrentDatabasePath, true);
        MessageBox.Show("Restore successful! "); 
    
        // and then reopen the connection
    
    }
    

    【讨论】:

    • 我以前做过那个代码。无论如何,这是错误。无法创建“filename.zip”,因为已存在同名文件或目录。
    • 无论如何,你对这段代码有什么看法? using(ZipFile zip= ZipFile.Read(ZipFileToExtract)) { zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently; zip.ExtractAll(TargetDirectory); }
    • 我没有。刚刚添加了这段代码。无论如何谢谢! :) zip.ExtractAll(Environment.CurrentDirectory, ExtractExistingFileAction.OverwriteSilently);
    【解决方案3】:
    private void btn_UodateMembers_Click(object sender, EventArgs e)
    {
        if (!bwUpdateMembers.IsBusy)
        {
            bwUpdateMembers.RunWorkerAsync();
        }
    }
    
    private string ExtractZip(FileInfo fi)
    {
        string extractTo = Path.Combine(fi.DirectoryName, Guid.NewGuid().ToString());
        using (ZipFile zip = ZipFile.Read(fi.FullName))
        {
            foreach (ZipEntry ze in zip)
            {
                ze.Extract(extractTo, ExtractExistingFileAction.OverwriteSilently);
            }
        }
    
        return extractTo;
    }
    
    public FileInfo GetLatestFile(DirectoryInfo di)
    {
        FileInfo fi = di.GetFiles()
            .OrderByDescending(d => d.CreationTime)
            .FirstOrDefault();
    
        return fi;
    }
    
    private void bwUpdateMembers_DoWork(object sender, DoWorkEventArgs e)
    {
        string path = "C:\\Users\\Ghost Wolf\\Desktop\\zip";
        DirectoryInfo di = new DirectoryInfo(path);
    
        if (di != null)
        {
            FileInfo fi = GetLatestFile(di);
            string folder = ExtractZip(fi);
            MessageBox.Show("Your'e Files Have Been Extracted", "Notice", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
        }
    }
    

    如果这对你有用,请告诉我!!

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2013-12-28
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 2020-09-03
      相关资源
      最近更新 更多