簡體   English   中英

如何用C#,WinForms覆蓋提取的zip文件?

[英]How to overwrite extracted zip file in C#, WinForms?

我有這個代碼,使用MS Access作為其數據庫在C#中備份和恢復。 我完成了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);
        }

我做到了! 對於那些需要代碼的人來說,這里是:

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

在您主動使用數據庫時,不能直接覆蓋數據庫。
通過主動,我的意思是你在該數據庫上打開了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

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

如果這是為你工作,請告訴我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM