@@ -771,12 +771,27 @@ void RecoverCommand::Execute(string command) {
771771 recResult.status == UsnRecoveryStatus::RESIDENT_DATA ||
772772 recResult.status == UsnRecoveryStatus::PARTIAL_RECOVERY) {
773773 string path = UsnTargetedRecovery::WideToNarrow (recResult.recoveredPath );
774- cout << " \n === 恢复成功 ===" << endl;
774+ if (recResult.usedClusterFiltering && recResult.clusterHealth .overwrittenClusters > 0 ) {
775+ cout << " \n === 部分恢复 ===" << endl;
776+ } else {
777+ cout << " \n === 恢复成功 ===" << endl;
778+ }
775779 cout << " 文件大小: " << recResult.recoveredSize << " bytes" << endl;
776780 cout << " 已保存到: " << path << endl;
777781 if (recResult.signatureMatched ) {
778782 cout << " 签名验证: 通过 (" << recResult.detectedType << " )" << endl;
779783 }
784+ if (recResult.usedClusterFiltering && recResult.clusterHealth .overwrittenClusters > 0 ) {
785+ cout << " 簇健康: " << recResult.clusterHealth .goodClusters << " /"
786+ << recResult.clusterHealth .totalClusters << " ("
787+ << fixed << setprecision (1 ) << recResult.clusterHealth .healthPercentage
788+ << " %) | 覆写簇: " << recResult.clusterHealth .overwrittenClusters
789+ << " | 检测: " << fixed << setprecision (1 )
790+ << recResult.clusterHealth .detectionTimeMs << " ms" << endl;
791+ if (recResult.clusterHealth .formatTruncated ) {
792+ cout << " 格式截断: 移除了 " << recResult.clusterHealth .truncatedBytes << " bytes" << endl;
793+ }
794+ }
780795 return ;
781796 } else {
782797 cout << " \n MFT 直接恢复失败: " << recResult.statusMessage << endl;
@@ -807,9 +822,21 @@ void RecoverCommand::Execute(string command) {
807822 recResult.status == UsnRecoveryStatus::RESIDENT_DATA ||
808823 recResult.status == UsnRecoveryStatus::PARTIAL_RECOVERY) {
809824 string path = UsnTargetedRecovery::WideToNarrow (recResult.recoveredPath );
810- cout << " \n === 恢复成功 ===" << endl;
825+ if (recResult.usedClusterFiltering && recResult.clusterHealth .overwrittenClusters > 0 ) {
826+ cout << " \n === 部分恢复 ===" << endl;
827+ } else {
828+ cout << " \n === 恢复成功 ===" << endl;
829+ }
811830 cout << " 文件大小: " << recResult.recoveredSize << " bytes" << endl;
812831 cout << " 已保存到: " << path << endl;
832+ if (recResult.usedClusterFiltering && recResult.clusterHealth .overwrittenClusters > 0 ) {
833+ cout << " 簇健康: " << recResult.clusterHealth .goodClusters << " /"
834+ << recResult.clusterHealth .totalClusters << " ("
835+ << fixed << setprecision (1 ) << recResult.clusterHealth .healthPercentage
836+ << " %) | 覆写簇: " << recResult.clusterHealth .overwrittenClusters
837+ << " | 检测: " << fixed << setprecision (1 )
838+ << recResult.clusterHealth .detectionTimeMs << " ms" << endl;
839+ }
813840 return ;
814841 }
815842
@@ -1099,16 +1126,26 @@ void RecoverCommand::Execute(string command) {
10991126 cout << " CRC校验: " << (result.crcValid ? " 通过" : " 警告" ) << endl;
11001127 } else {
11011128 // 回退到普通恢复
1102- recovered = carveRecovery.RecoverCarvedFile (selected.carveInfo , outputPath);
1129+ ClusterHealthReport carveHealth;
1130+ recovered = carveRecovery.RecoverCarvedFile (selected.carveInfo , outputPath, &carveHealth);
11031131 if (recovered) {
11041132 cout << " 恢复成功 (无EOCD,使用估算大小)" << endl;
1133+ if (carveHealth.overwrittenClusters > 0 ) {
1134+ cout << " 簇健康: " << fixed << setprecision (1 )
1135+ << carveHealth.healthPercentage << " %" << endl;
1136+ }
11051137 }
11061138 }
11071139 } else {
1108- recovered = carveRecovery.RecoverCarvedFile (selected.carveInfo , outputPath);
1140+ ClusterHealthReport carveHealth;
1141+ recovered = carveRecovery.RecoverCarvedFile (selected.carveInfo , outputPath, &carveHealth);
11091142 if (recovered) {
11101143 cout << " 恢复成功!" << endl;
11111144 cout << " 文件大小: " << selected.carveInfo .fileSize << " bytes" << endl;
1145+ if (carveHealth.overwrittenClusters > 0 ) {
1146+ cout << " 簇健康: " << fixed << setprecision (1 )
1147+ << carveHealth.healthPercentage << " %" << endl;
1148+ }
11121149 }
11131150 }
11141151
@@ -1161,16 +1198,26 @@ void RecoverCommand::Execute(string command) {
11611198 cout << " 文件大小: " << result.actualSize << " bytes" << endl;
11621199 cout << " CRC校验: " << (result.crcValid ? " 通过" : " 警告" ) << endl;
11631200 } else {
1164- recovered = carveRecovery.RecoverCarvedFile (best.carveInfo , outputPath);
1201+ ClusterHealthReport carveHealth;
1202+ recovered = carveRecovery.RecoverCarvedFile (best.carveInfo , outputPath, &carveHealth);
11651203 if (recovered) {
11661204 cout << " 恢复成功 (无EOCD,使用估算大小)" << endl;
1205+ if (carveHealth.overwrittenClusters > 0 ) {
1206+ cout << " 簇健康: " << fixed << setprecision (1 )
1207+ << carveHealth.healthPercentage << " %" << endl;
1208+ }
11671209 }
11681210 }
11691211 } else {
1170- recovered = carveRecovery.RecoverCarvedFile (best.carveInfo , outputPath);
1212+ ClusterHealthReport carveHealth;
1213+ recovered = carveRecovery.RecoverCarvedFile (best.carveInfo , outputPath, &carveHealth);
11711214 if (recovered) {
11721215 cout << " 恢复成功!" << endl;
11731216 cout << " 文件大小: " << best.carveInfo .fileSize << " bytes" << endl;
1217+ if (carveHealth.overwrittenClusters > 0 ) {
1218+ cout << " 簇健康: " << fixed << setprecision (1 )
1219+ << carveHealth.healthPercentage << " %" << endl;
1220+ }
11741221 }
11751222 }
11761223
0 commit comments