如何知道Windows中的Compact Os使用的压缩算法?

如何知道Windows中的Compact Os使用的压缩算法?

通过使用该命令,compact.exe /compactos:query我得到的只是紧凑操作系统压缩是否被激活,但不知道使用了什么压缩算法,例如 LZX、XPRESS4K、XPRESS8K 或 XPRESS16K。

compact.exe /exe:algorithm按照建议尝试https://renenyffenegger.ch/notes/Windows/dirs/Windows/System32/compact_exe没有运气。它不理解开关并返回开关列表的一般解释/?

仅供参考,我在安装 Windows 后使用命令压缩了驱动器,compact.exe /compactos:always没有使用任何附加开关。到目前为止,性能还不错。

还有一个问题,我看了好几篇文章,说这种方法只能压缩系统文件或者可执行文件,pdf,图片,音频,txt等数据文件是不是不能压缩,我还能放心吗?

答案1

我如何知道使用的压缩算法CompactOs

似乎没有办法检索所使用的算法。

我尝试了“compact.exe /exe:algorithm”

algorithm是占位符。您应该将其替换为受支持的压缩方法之一:

/EXE使用针对经常读取且不被修改的可执行文件进行优化的压缩,

支持的算法包括:

XPRESS4K(最快)默认

XPRESS8K

XPRESS16K

LZX (最紧凑)

来源:压缩 - 压缩文件 - Windows CMD - SS64.com

使用示例:

compact /exe:XPRESS4K

我在安装 Windows 后使用命令压缩了驱动器compact.exe /compactos:always,没有使用任何附加开关。我在几篇文章中读到,只有系统文件或可执行文件通过这种方法压缩。

这几乎是正确的。它只会压缩“OS 二进制文件”。这可能包括系统可执行文件和 DLL 文件,但不包括其他非系统可执行文件。

/CompactOs 设置或查询系统压缩状态。

支持的选项包括:

query - 查询系统紧凑状态。

always-压缩所有操作系统二进制文件并将系统状态设置为非紧凑。

never - 解压缩所有操作系统二进制文件并将系统状态设置为紧凑,除非管理员更改它。

(重点是我的)

来源:压缩 - 压缩文件 - Windows CMD - SS64.com

。我能放心pdf,图片,音频,txt等数据文件没有被压缩吗?

是的。文档中没有提到这些类型的文件。

答案2

Compact.exe 已默认向您显示算法

PS D:\压缩> compact *.txt

 清单 D:\compressed\
 添加到此目录的新文件将不会被压缩。

   195634 : 86016 = 2.3 比 1CLZNT1.txt
   195634 : 45056 = 4.3 比 1獻錄.txt
   195634 : 195634 = 1,0 到 1 No_compression.txt
   195634 : 69632 = 2.8 比 1XXPRESS16K.txt
   195634 : 81920 = 2.4 比 1XXPRESS4K.txt
   195634 : 73728 = 2.7 比 1XXPRESS8K.txt
                                 ↑压缩算法
1 个目录中的 6 个文件
其中 5 个被压缩,1 个未被压缩。
总共 1.173.804 字节的数据存储在 551.986 字节中。
压缩比为2.1比1。

参见倒数第二列,C表示默认的 LZNT1 算法,l是 LZX,x是 XPRESS4K,X是 XPRESS8K 或 XPRESS16K。实际上,compact列出文件就像dir您可以使用它compact /a来显示系统/隐藏文件或compact /s递归显示文件

不幸的是,没有办法区分 XPRESS8K 和 XPRESS16K compact.exe,但你可以通过直接调用 Win32 API 来做到这一点。CompactOs 的新算法通过 Windows Overlay Filter (WOF) 处理,你可以使用它的WofIsExternalFileAPI 来检索压缩信息。我编写了一个名为compression.ps1do do that 的 PowerShell 脚本。以下是针对上述相同文件的输出

PS D:\compressed> .\compression.ps1 (ls *.txt)

FileName                              Algorithm
--------                              ---------
D:\compressed\LZNT1.txt                   LZNT1
D:\compressed\LZX.txt                       LZX
D:\compressed\No_compression.txt NO_COMPRESSION
D:\compressed\XPRESS16K.txt           XPRESS16K
D:\compressed\XPRESS4K.txt             XPRESS4K
D:\compressed\XPRESS8K.txt             XPRESS8K

这是它的源代码,只需保存为 *.ps1 并按上述方法运行即可

param(
    [Parameter()]
    [string[]]$fileList
)

Add-Type -Name 'Wof' -Namespace 'Wofutil' -MemberDefinition @'
    public struct ExternalFileInfo
    {
        public uint algorithm;
        public uint flags;
    }

    [DllImport("Wofutil.dll")]public static extern int WofIsExternalFile(
        [MarshalAs(UnmanagedType.LPWStr)] string Filepath,
        out int IsExternalFile,
        out uint Provider,
        out ExternalFileInfo Info,
        ref uint BufferLength
    );
'@

enum Algorithms {
    NO_COMPRESSION = -2
    LZNT1          = -1
    XPRESS4K       = 0
    LZX            = 1
    XPRESS8K       = 2
    XPRESS16K      = 3
}

class CompressionInfo {
    [string]$FileName
    [Algorithms]$Algorithm
}

foreach ($fileName in $fileList) {
    $f = Get-ChildItem -LiteralPath $fileName
    if (($f.Attributes -band [IO.FileAttributes]::Compressed) -ne 0) {
        [CompressionInfo]@{
            FileName = $f
            Algorithm = 'LZNT1'
        }
    } else {
        [int]$isExternalFile = 0
        [uint32]$provider = 0
        $fileInfo = New-Object Wofutil.Wof+ExternalFileInfo
        [uint32]$length = 8

        [void][Wofutil.Wof]::WofIsExternalFile($f, [ref]$isExternalFile,
            [ref]$provider, [ref]$fileInfo, [ref]$length)
        if ($isExternalFile -ne 0) {
            [CompressionInfo]@{
                FileName = $f
                Algorithm = $fileInfo.algorithm
            }
        } else {
            [CompressionInfo]@{
                FileName = $f
                Algorithm = 'NO_COMPRESSION'
            }
        }
    }
}

请注意,NTFS 压缩和 CompactOS 是完全不同的功能。当 MS 推出新的 CompactOS 功能时,他们将其合并到命令中,compact因为它们与压缩有关。但 CompactOS 纯粹是为了压缩只读系统文件以节省操作系统占用空间。您可以清楚地看到,调用该选项是/exe因为它旨在压缩可执行文件。这就是为什么新算法不是为编辑而设计的,写入文件会解压缩它们

PS D:\压缩> echo x >.\LZX.txt# 将更多数据写入文件

PS D:\压缩> 压缩.\LZX.txt# 现在文件已解压缩

 清单 D:\compressed\
 添加到此目录的新文件将不会被压缩。

        8 : 8 = 1,0 到 1 LZX.txt

共 1 个文件,位于 1 个目录中
0表示压缩,1表示未压缩。
总共8个字节的数据存储在8个字节中。
压缩率为1.0比1。

另一方面,NTFS 压缩功能使用旧的 LZNT1 算法,旨在处理任何文件。它支持即时编辑你可以随意写入文件,文件仍然会被压缩。你也可以使用 LZNT1 将文件夹中的新文件标记为自动压缩,但不使用新算法

请注意,该/exe选项不适用于检查算法,而是指定压缩时的算法。compact /C /exe:<algorithm> your_files将使用指定的 EXE 算法压缩指定的文件,而compact /C your_files将使用 NTFS 压缩来压缩文件

答案3

关于你的主要问题 - CompactOS 使用什么算法 - 我可以确认总是使用XPRESS4K. 不需要用compact命令来检查。

此外,CompactOS不允许用户选择算法。如果您尝试组合/CompactOS/EXE命令行参数,compact.exe将无法识别它们。

相关内容