C#如何解压cab文件

方法一:执行CMD命令进行解压

expand [sourcefile] -f:* [targetDir]

/// <summary>
/// 执行cmd命令 返回cmd窗口显示的信息
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// </summary>
///<param name="cmd">执行的命令</param>
public static string RunCmd(string cmd)
{
    cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
    using (Process p = new Process())
    {
        p.StartInfo.FileName = CmdPath;
        p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
        p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
        p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
        p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
        p.StartInfo.CreateNoWindow = true; //不显示程序窗口
        p.Start();//启动程序
 
        //向cmd窗口写入命令
        p.StandardInput.WriteLine(cmd);
        p.StandardInput.AutoFlush = true;
 
        //获取cmd窗口的输出信息
        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();//等待程序执行完退出进程
        p.Close();
 
        return output;
    }
}

方法二:使用系统API- FDICopy 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
 
 
 
 
    public class CabExtractor : IDisposable
    {
        private static class NativeMethods
        {
            [StructLayout(LayoutKind.Sequential)]
            internal class CabError //Cabinet API: "ERF"
            {
                public int erfOper;
                public int erfType;
                public int fError;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal class FdiNotification //Cabinet API: "FDINOTIFICATION"
            {
                internal int cb;
                //not sure if this should be a IntPtr or a strong
                internal IntPtr psz1;
                internal IntPtr psz2;
                internal IntPtr psz3;
                internal IntPtr pv;
                internal IntPtr hf;
                internal short date;
                internal short time;
                internal short attribs;
                internal short setID;
                internal short iCabinet;
                internal short iFolder;
                internal int fdie;
 
            }
 
            internal enum FdiNotificationType
            {
                CabinetInfo,
                PartialFile,
                CopyFile,
                CloseFileInfo,
                NextCabinet,
                Enumerate
            }
 
 
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            internal delegate IntPtr FdiMemAllocDelegate(int numBytes);
 
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            internal delegate void FdiMemFreeDelegate(IntPtr mem);
 
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            internal delegate IntPtr FdiFileOpenDelegate(string fileName, int oflag, int pmode);
 
            [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
            internal delegate Int32 FdiFileReadDelegate(IntPtr hf,
                                                       [In, Out] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2,
                                                           ArraySubType = UnmanagedType.U1)] byte[] buffer, int cb);
 
            [UnmanagedFunction
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值