几周前,我家电脑开着的时候断电了。最近我遇到了一些问题。
所以我做了一个完整的系统检查,我使用了适用于 Windows 的 SeaTools,所有驱动器都通过了 SMART 检查、短驱动器自我检查和短通用检查,CrystalDiskInfo 也显示我的所有驱动器都没有硬件错误,我使用了 CrystalDiskMark 发现驱动器性能良好。
我甚至用过磁盘精灵执行坏扇区检查时,它会逐个扇区扫描整个驱动器,以确定是否存在坏扇区。没有坏扇区。
我完全确定我的驱动器没有物理问题,但文件系统错误......
我已经chkdsk /f X:
在所有驱动器上运行过,以下是我发现的结果:
Checking file system on D:
The type of the file system is NTFS.
Chkdsk cannot run because the volume is in use by another
process. Chkdsk may run if this volume is dismounted first.
ALL OPENED HANDLES TO THIS VOLUME WOULD THEN BE INVALID.
Would you like to force a dismount on this volume? (Y/N) Volume dismounted. All opened handles to this volume are now invalid.
Volume label is Tremillia.
Stage 1: Examining basic file system structure ...
Attribute record of type 0x80 and instance tag 0x4 is cross linked
starting at 0x9383fc2 for possibly 0xfe clusters.
Some clusters occupied by attribute of type 0x80 and instance tag 0x4
in file 0x46c4 is already in use.
Deleting corrupt attribute record (0x80, "")
from file record segment 0x46C4.
Attribute record of type 0x80 and instance tag 0x4 is cross linked
starting at 0x93840c0 for possibly 0x95 clusters.
Some clusters occupied by attribute of type 0x80 and instance tag 0x4
in file 0x46c5 is already in use.
Deleting corrupt attribute record (0x80, "")
from file record segment 0x46C5.
Attribute record of type 0x80 and instance tag 0x4 is cross linked
starting at 0x9384489 for possibly 0xc5 clusters.
Some clusters occupied by attribute of type 0x80 and instance tag 0x4
in file 0x4706 is already in use.
Deleting corrupt attribute record (0x80, "")
from file record segment 0x4706.
Attribute record of type 0x80 and instance tag 0x4 is cross linked
starting at 0x938454e for possibly 0x90 clusters.
Some clusters occupied by attribute of type 0x80 and instance tag 0x4
in file 0x470b is already in use.
Deleting corrupt attribute record (0x80, "")
...
有很多这样的记录。我很确定这些文件被损坏了。
我想确定哪些文件受到了影响。
我打开eventvwr.msc
Windows 日志 > 应用程序和Ctrl+ F“chkdsk”并找到了它的记录。
这就是我获取文件记录段的方法。
您可以看到它如果你想。
我使用 Google 搜索了一种方法,以找到一种使用各种排列来确定逐个文件记录段的方法,但没有找到任何相关内容,所有内容都是关于的chkdsk
,然后我搜索了一种通过文件地址识别文件的方法,发现ntfscluster
这是一个 Linux 实用程序。
然后我谷歌搜索了 ntfscluster Windows,发现Windows 版 NtfsProgs它很古老,自 2004 年以来就没有更新过。我下载了它,打开后发现缺少 libintl3.dll,下载上述 .dll 并放到其目录后,发现缺少 libiconv2.dll。
经过所有的麻烦之后我得到了这个:
PS C:\Users\Xeni> C:\Users\Xeni\Downloads\ntfsprogs-1.9.0-bin\bin\ntfscluster.exe -I 154681282 D:
Failed to set locale, using default '(null)'.
win32_io.c(199): ntfs_device_win32_open The handle is invalid.
ioctl failed
Couldn't mount device 'D:': Invalid argument
这不起作用。
然后我尝试了许多其他关键词,终于找到了我想要的内容:nfi.exe
PS C:\Users\Xeni> D:\downloads\nfi\nfi.exe D: 154681282
NTFS File Sector Information Utility.
Copyright (C) Microsoft Corporation 1999. All rights reserved.
***Logical sector 154681282 (0x9383fc2) on drive D is in file number 551312.
\Games\Saints Row 4\packfiles\pc\cache\dlc3.vpp_pc
$STANDARD_INFORMATION (resident)
$FILE_NAME (resident)
$FILE_NAME (resident)
$DATA (nonresident)
logical sectors 154625064-154690687 (0x9376428-0x938647f)
我可以编写一个 Python 脚本来遍历记录的行并进行筛选"from file record segment "
,然后使用索引切片来获取地址并nfi.exe
异步调用以获取受影响的文件。这真的很容易。我甚至不需要为此使用正则表达式。
但问题是数据不完整,当我运行命令时,chkdsk
记录太多,控制台屏幕缓冲区被多次覆盖。当然,我已经重新启动了计算机,因为 chkdsk 只能在 wininit 期间在 C: 上运行。
那么我怎样才能获得所有受 chkdsk 影响的地址?
答案1
刚刚找到我要找的东西。使用eventvwr.msc
日志将被截断。
每个驱动器的根目录下都有文件夹System Volume Information
。这些文件夹是隐藏的。我当然早就启用了查看隐藏文件的功能。
尝试打开文件夹将导致访问被拒绝错误。
因此我右键单击它,单击“属性”,然后单击“安全”,然后单击“编辑”、“添加”,输入我的用户名,“检查名称”,选中“完全控制”,“应用”,“确定”,“确定”。
完成此操作后,我获得了此文件夹的访问权限。其中有一个 chkdsk 文件夹,完整的日志文件都存储在那里。