通过使用该命令,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) 处理,你可以使用它的WofIsExternalFile
API 来检索压缩信息。我编写了一个名为compression.ps1
do 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
将无法识别它们。