最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net?生成壓縮文件問(wèn)題記錄(推薦)

 更新時(shí)間:2022年02月28日 09:46:33   作者:One?To?One  
由于公司開(kāi)發(fā)項(xiàng)目需要遷移部署到Linux環(huán)境部署運(yùn)行,之前項(xiàng)目中生成Zip壓縮文件的代碼邏輯在Linux運(yùn)行生成壓縮文件不正常,今天通過(guò)本文給大家分享.Net?生成壓縮文件問(wèn)題記錄,感興趣的朋友一起看看吧

一、起因

 由于公司開(kāi)發(fā)項(xiàng)目需要遷移部署到Linux環(huán)境部署運(yùn)行,之前項(xiàng)目中生成Zip壓縮文件的代碼邏輯在Linux運(yùn)行生成壓縮文件不正常。

 本篇記錄文件排查處理過(guò)程。

二、問(wèn)題現(xiàn)象

  • 壓縮文件生成目錄不正確,文件目錄為:\root\ziptest\upgrade\_dsconnCfg.txt(項(xiàng)目部署目錄)
  • 壓縮文件數(shù)量不正確
  • 壓縮文件最后修改時(shí)間不匹配

 待壓縮文件:

  

 壓縮結(jié)果:

三、解決過(guò)程:

 1、原始實(shí)現(xiàn)壓縮的主要邏輯:

using System.IO.Compression;
using System.IO;
/// <summary>
/// 文件壓縮類
/// </summary>
public class ZipHelper
{
    /// <summary>
    /// 單文件壓縮成ZIP
    /// </summary>
    /// <param name="fileSource">源文件路徑</param>
    /// <param name="fileOut">ZIP文件路徑</param>
    /// <param name="fileName">ZIP文件名</param>
    /// <returns></returns>
    public static bool SimpleFileZip(string fileSource, string fileOut, string fileName)
    {
        try
        {
            using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.Create))
            {
                using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
                {
                    ZipFile(fileSource, fileName, archive);
                }
            }
        }
        catch
        {
            return false;
        }
        return true;
    }
    /// <summary>
    /// 多文件壓縮成ZIP
    /// </summary>
    /// <param name="fileSource">源文件路徑</param>
    /// <param name="fileOut">ZIP文件路徑</param>
    /// <param name="fileName">ZIP文件名</param>
    /// <returns></returns>
    public static bool FilesZip(List<string> fileSources, string fileOut)
    {
        try
        {
            using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.Create))
            {
                using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
                {
                    foreach (var file in fileSources)
                    {               //計(jì)算相對(duì)路徑
                        string fileName = file.Replace(AppConsts.ServerUpdateFile + "\\", "");
                        ZipFile(file, fileName, archive);
                    }
                }
            }
        }
        catch
        {
            return false;
        }
        return true;
    }
    private static void ZipFile(string fileSource, string fileName, ZipArchive archive)
    {
        ZipArchiveEntry readMeEntry = archive.CreateEntry(fileName);     //設(shè)置文件最后修改時(shí)間
        readMeEntry.LastWriteTime = File.GetLastWriteTime(fileSource);
        using (Stream stream = readMeEntry.Open())
        {
            byte[] bytes = File.ReadAllBytes(fileSource);
            stream.Write(bytes, 0, bytes.Length);
        }
    }
}

 2、生成路徑不正確問(wèn)題:通過(guò)對(duì)代碼檢測(cè)發(fā)現(xiàn),在代碼中處理邏輯對(duì)目錄路徑替換處理時(shí):使用了"\\";導(dǎo)致在Linux代碼無(wú)效。修改對(duì)于代碼為以下內(nèi)容:

/// <summary>
/// 多文件壓縮成ZIP
/// </summary>
/// <param name="fileSource">源文件路徑</param>
/// <param name="fileOut">ZIP文件路徑</param>
/// <param name="fileName">ZIP文件名</param>
/// <returns></returns>
public static bool FilesZip(List<string> fileSources, string fileOut)
{
    try
    {
        using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate))
        {
            using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
            {
                foreach (var file in fileSources)
                {            //計(jì)算壓縮文件相對(duì)路徑:目錄/文件名
                    string fileName = file.Replace(AppConsts.ServerUpdateFile + Path.DirectorySeparatorChar, "");
                    ZipFile(file, fileName, archive);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"ERROR:{ex}");
        return false;
    }
    return true;
}

 3、排查生成文件數(shù)量異常問(wèn)題,輸出異常信息。

ERROR:Cannot modify entry in Create mode after entry has been opened for writing.
   at System.IO.Compression.ZipArchiveEntry.set_LastWriteTime(DateTimeOffset value)
   at zlWebPluginsUpgradeServer.Upgrade.ZipHelper.ZipFile(String fileSource, String fileName, ZipArchive archive) in F:\coding\ZlsoftClientService\zlWebPluginsUpgradeServer\UpgradeMode\ZipHelper.cs:line 84
   at zlWebPluginsUpgradeServer.Upgrade.ZipHelper.FilesZip(List`1 fileSources, String fileOut) in F:\coding\ZlsoftClientService\zlWebPluginsUpgradeServer\UpgradeMode\ZipHelper.cs:line 62

  發(fā)現(xiàn)因?yàn)樯蓧嚎s文件后設(shè)置最后修改時(shí)間異常,導(dǎo)致生成壓縮文件數(shù)量不正確;且最后修改時(shí)間不匹配。

 4、根據(jù)日志,調(diào)整

using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))

到此以上在Linux中生成壓縮文件問(wèn)題都已解決。

四、總結(jié):

 1、代碼中路徑操作,不要使用固定字符串;應(yīng)該使用Path類提供的相關(guān)字段、方法操作

 2、設(shè)置壓縮項(xiàng)屬性時(shí),需要使用Update模式。

最后放上壓縮幫助類:

/// <summary>
/// 文件壓縮類
/// </summary>
public class ZipHelper
{
    /// <summary>
    /// 單文件壓縮成ZIP
    /// </summary>
    /// <param name="fileSource">源文件路徑</param>
    /// <param name="fileOut">ZIP文件路徑</param>
    /// <param name="fileName">ZIP文件名:相對(duì)路徑</param>
    /// <returns></returns>
    public static void SimpleFileZip(string fileSource, string fileOut, string fileName)
    {
        using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate))
        {
            using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
            {
                fileName = fileName.Trim(Path.DirectorySeparatorChar);
                ZipFile(fileSource, fileName, archive);
            }
        }
    }

    /// <summary>
    /// 多文件壓縮成ZIP
    /// </summary>
    /// <param name="fileSource">源文件路徑</param>
    /// <param name="fileOut">ZIP文件路徑</param>
    /// <param name="fileName">ZIP文件名</param>
    /// <returns></returns>
    public static void FilesZip(List<string> fileSources, string fileOut)
    {
        using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate))
        {
            using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
            {
                foreach (var file in fileSources)
                {
                    string fileName = file.Replace(AppConsts.ServerUpdateFile + Path.DirectorySeparatorChar, "");
                    ZipFile(file, fileName, archive);
                }
            }
        }
    }

    /// <summary>
    /// 壓縮指定文件夾
    /// </summary>
    /// <param name="sourceDirectory"></param>
    /// <param name="fileOut"></param>
    public static void DirectoryZip(string sourceDirectory, string fileOut)
    {
        string[] allFiles = Directory.GetFiles(sourceDirectory, "", SearchOption.AllDirectories);
        using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate))
        {
            using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
            {
                foreach (var file in allFiles)
                {
                    //獲取壓縮文件相對(duì)目錄
                    string fileName = file.Replace(sourceDirectory + Path.DirectorySeparatorChar, "");
                    ZipFile(file, fileName, archive);
                }
            }
        }
    }

    /// <summary>
    /// 解壓文件到指定目錄
    /// </summary>
    /// <param name="upZipDirPath"></param>
    /// <param name="zipPath"></param>
    public static void UnZip(string upZipDirPath, string zipPath)
    {
        if (!Directory.Exists(upZipDirPath))
            Directory.CreateDirectory(upZipDirPath);
        using (FileStream zipFileToOpen = new FileStream(zipPath, FileMode.Open))
        {
            using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
            {
                archive.ExtractToDirectory(upZipDirPath);
            }
        }
    }

    /// <summary>
    /// 生成壓縮文件
    /// </summary>
    /// <param name="fileSource">源文件</param>
    /// <param name="fileName">壓縮文件相對(duì)目錄</param>
    /// <param name="archive">壓縮文件包</param>
    private static void ZipFile(string fileSource, string fileName, ZipArchive archive)
    {
        ZipArchiveEntry readMeEntry = archive.CreateEntry(fileName);
        readMeEntry.LastWriteTime = File.GetLastWriteTime(fileSource);
        using (Stream stream = readMeEntry.Open())
        {
            byte[] bytes = File.ReadAllBytes(fileSource);
            stream.Write(bytes, 0, bytes.Length);
        }
    }
}

到此這篇關(guān)于.Net 生成壓縮文件問(wèn)題記錄(推薦)的文章就介紹到這了,更多相關(guān).Net 壓縮文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • asp.net快速連接access

    asp.net快速連接access

    網(wǎng)上有很多人在問(wèn)asp.net連接access的問(wèn)題,作為一個(gè)程序員,我覺(jué)得非常有必要分享一下我是怎么快速,簡(jiǎn)單連接access數(shù)據(jù)庫(kù)的。本經(jīng)驗(yàn)采用HTML代碼結(jié)合JS模式,直接寫在網(wǎng)頁(yè)中,非常適合學(xué)習(xí)新手。
    2015-09-09
  • .NET中STAThread的使用詳解

    .NET中STAThread的使用詳解

    這個(gè)STA線程模型,在線程內(nèi)加入了訊息幫浦等等機(jī)制,減少開(kāi)發(fā)人員撰寫窗口程序的工作量
    2013-05-05
  • .Net防sql注入的幾種方法

    .Net防sql注入的幾種方法

    這篇文章主要給大家總結(jié)介紹了關(guān)于.Net防sql注入的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.Net具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • MVC4制作網(wǎng)站教程第四章 部分欄目功能實(shí)現(xiàn)代碼

    MVC4制作網(wǎng)站教程第四章 部分欄目功能實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了MVC4制作網(wǎng)站教程,部分欄目功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Prism區(qū)域管理器IRegionManager用法介紹

    Prism區(qū)域管理器IRegionManager用法介紹

    這篇文章介紹了Prism區(qū)域管理器IRegionManager用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • Gridview利用DataFormatString屬性設(shè)置數(shù)據(jù)格式的方法

    Gridview利用DataFormatString屬性設(shè)置數(shù)據(jù)格式的方法

    這篇文章主要介紹了Gridview利用DataFormatString屬性設(shè)置數(shù)據(jù)格式的方法,涉及Gridview屬性操作及數(shù)據(jù)格式相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • 用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼

    用Html5與Asp.net MVC上傳多個(gè)文件的實(shí)現(xiàn)代碼

    Html 5 的有一些File API,對(duì)Form表單增強(qiáng)的特性,讓我們輕松支持多文件上傳,看下面的Html片斷代碼
    2012-08-08
  • 理解HttpHandler,并為所有*.jpg圖片生成一段文字于圖片上

    理解HttpHandler,并為所有*.jpg圖片生成一段文字于圖片上

    HttpHandler就是最終相應(yīng)HTTP請(qǐng)求,生成HTTP響應(yīng)的處理器,他們的實(shí)例由asp.net運(yùn)行時(shí)創(chuàng)建,,并生存在asp.net的運(yùn)行時(shí)環(huán)境中,如果asp.net運(yùn)行時(shí)是處理請(qǐng)求的工廠,HttpHandler是處理請(qǐng)求的工人
    2012-03-03
  • C# 文件上傳 默認(rèn)最大為4M的解決方法

    C# 文件上傳 默認(rèn)最大為4M的解決方法

    .net中默只能上傳小于4m的文件,大于4M將無(wú)法顯示頁(yè)面.那么如何設(shè)置來(lái)使imputfile能上傳更大的文件呢
    2008-11-11
  • asp.net core多文件分塊同時(shí)上傳組件使用詳解

    asp.net core多文件分塊同時(shí)上傳組件使用詳解

    這篇文章主要為大家介紹了一個(gè)可多個(gè)文件同時(shí)上傳、斷點(diǎn)續(xù)傳,并實(shí)時(shí)反饋上傳進(jìn)度的 Asp.Net core 組件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

且末县| 平邑县| 东乡族自治县| 休宁县| 吴川市| 海原县| 右玉县| 容城县| 长白| 中超| 九龙城区| 清徐县| 仙游县| 蒙城县| 兴城市| 阿勒泰市| 西吉县| 黎平县| 南昌县| 永新县| 右玉县| 金塔县| 泸溪县| 张家口市| 陈巴尔虎旗| 渝中区| 巫溪县| 铁力市| 会理县| 梅河口市| 疏附县| 岱山县| 潞西市| 崇礼县| 义马市| 天柱县| 高阳县| 浮梁县| 南岸区| 志丹县| 元江|