文章目录
  1. 1. 起因
  2. 2. CHK文件
  3. 3. 恢复文件
  4. 4. 其它
  5. 5.

在使用电脑的过程中,总会遇到各种各样的故障,导致电脑非正常关机,或者由于其它的原因,最终使得磁盘某些文件(夹)存储出现错误。一般表现为文件夹无法访问,或者是在资源管理器中看不到对应文件或文件夹(而实际上这些文件还是可访问),这时候我们就需要想办法将这些数据恢复到正常状态或者从磁盘中删除了,因为虽然你无法通过资源管理器或者一般应用去访问这些数据,但是它们其实还是被存储在磁盘中某一个区域,仍然占据着磁盘空间。

起因

前一阵子电脑偶尔出现开机黑屏或者运行时死机的现象,没办法,都是直接长按电源键直接关机了(这里顺便提一下,如果你在碰倒电脑无反应需要强制关机的时候,建议等一等,看一看这个时候硬盘灯是不是亮着,如果亮着,请尽量等待它熄了之后在强关。当然,如果没有硬盘指示灯的就没办法了,可以试着听一下声音看硬盘是否正在被访问),而就在不久前一次开机,就突然发现一个绿色小软件打不开了,提示无法找到路径(桌面快捷方式打开的),于是进资源管理器一看,文件夹还在,但是双击就提示“文件或目录已损坏且无法读取,请运行chkdsk工具修复”,对该文件夹也无法进行任何操作,包括改名删除等。

于是上网搜了一下,大概就是说磁盘文件目录出错,按照提示用chkdsk命令修复就行了。那么首先就是用管理员权限运行命令提示符(cmd),然后可以输入chkdsk /?来查看这个命令的帮助以及参数:

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有权利。

C:\Windows\system32>chkdsk /?
检查磁盘并显示状态报告。

CHKDSK [volume[[path]filename]]] [/F] [/V] [/R] [/X] [/I] [/C] [/L[:size]] [/B] [/scan] [/spotfix]

  volume          指定驱动器号(后面跟一个冒号)、
                  装入点或卷名。
  filename        仅 FAT/FAT32: 指定要检查
                  碎片的文件。
  /F              修复磁盘上的错误。
  /R              查找坏扇区并恢复可读信息
                  (未指定 /scan 时,隐含 /F)。
  /X              如果必要,则先强制卸除卷。
                  该卷的所有打开的句柄都将无效
                  (隐含 /F)。
  /scan           仅 NTFS: 在卷上运行联机扫描
  /offlinescanandfix  在卷上运行脱机扫描并进行修复。
  ...

/I 或 /C 开关通过跳过对卷的某些检查,
来减少运行 Chkdsk 所需的时间长度。

因为我的受损的文件存储在D盘,所以直接输入chkdsk D: /R,这是如果被检查的盘上有文件正在被使用,就会提示是否强制卸载该卷(y/n),一般选择n,然后就会提示是否创建计划任务,在下次开机时运行检查,这时可以选择是,然后重启就会开始进行检查。

当重启进入系统后,可以发现损坏的目录已经消失了,然后我就去重新下载了那个软件,放到原来的路径下,就继续开始使用了。本以为一切就此结束,但是今天却在用另外一个软件(也是在D盘)的时候发现了问题。

CHK文件

由于突然想来亲自验证一下C++中static成员变量的初始化顺序,以便确定前几天所想的适用于多线程环境中的单实例类是否能正确运行,于是从桌面快捷方式直接启动CodeBlocks,结果进入之后右下角提示在指定的位置找不到编译器。

于是在桌面右键程序图标查看快捷方式属性,结果突然提示快捷方式起始位置不存在,然后就发现快捷方式中目标属性指向了地址D:\found.000\dir0000.chk\codeblocks.exe,而起始位置属性则是指向了D:\Program Files(x86)\Codeblocks;于是进入资源管理器,D盘根目录下找不到found.000文件夹,而Program Files(x86)目录下也没有CodeBlocks文件夹…没办法,只有从任务管理器进入进程所在目录了,结果提示文件夹无法访问,在地址栏输入路径也是一样的结果。

但是明明通过快捷方式是可以打开程序的,这说明程序文件夹依然完好无损,而且在CodeBlocks编译器设置中通过点击自动设置编译器所在目录,编译器也可以正常启动运行了,此时在设置中可以看到设置的编译器位置为D:\found.000\dir0000.chk\MinGW\bin,也说明这个路径是存在的,只是我们需要一些特殊的方法进去了。

首先在网上搜索了一下CHK文件,结果显示这是Windows磁盘修复时创建的文件,描述为“恢复的文件碎片”,也就是当Windows进行磁盘修复时检测到出现错误的文件或文件夹,会在当前磁盘根目录下创建found.000found.001等文件夹保存这些恢复的文件,所以通过将这个文件夹中的东西恢复,就可以找回丢失的数据了,当然,不一定全部且正确。

恢复文件

那么接下来依然是CMD了,使用管理员权限启动,尝试通过cd命令进入found.000文件夹,居然成功了,那么看起来似乎可行。然后通过dir命令查看这个文件夹下面的所有文件和文件夹信息,结果没有看到dir0000.chk目录,于是查看dir命令帮助:

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有权利。

C:\Windows\system32>dir /?
显示目录中的文件和子目录列表。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

  [drive:][path][filename]
              指定要列出的驱动器、目录和/或文件。

  /A          显示具有指定属性的文件。
  属性         D  目录                R  只读文件
               H  隐藏文件            A  准备存档的文件
               S  系统文件            I  无内容索引文件
               L  解析点             -  表示“否”的前缀
  /S          显示指定目录和所有子目录中的文件。
  ...

可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。

于是使用dir . /A:Hdir0000.chk目录就可以看到了,当然即使看不到我们也可以使用cd dir0000.chk命令直接进入,这里之所以显示全部文件,是为了看看到底有多少CHK文件。那么接下来就该想办法把文件夹从这里面原样复制出去了,毕竟我们通过资源管理器没办法访问到这里,由于这是一个目录,那么就不能通过copy命令了,这里我们使用copy命令的增强版xcopy命令:

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有权利。

C:\Windows\system32>xcopy /?
复制文件和目录树。

XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z] [/B] [/J]
                           [/EXCLUDE:file1[+file2][+file3]...]

  source       指定要复制的文件。
  destination  指定新文件的位置和/或名称。
  /S           复制目录和子目录,不包括空目录。
  /E           复制目录和子目录,包括空目录。
               与 /S /E 相同。可以用来修改 /T。
  /C           即使有错误,也继续复制。
  /G           允许将加密文件复制到
               不支持加密的目标。
  /H           也复制隐藏文件和系统文件。
  /K           复制属性。一般的 Xcopy 会重置只读属性。
  /O           复制文件所有权和 ACL 信息。
  /X           复制文件审核设置(隐含 /O)。
  /J           复制时不使用缓冲的 I/O。推荐复制大文件时使用。
  ...

开关 /Y 可以预先在 COPYCMD 环境变量中设置。
这可能被命令行上的 /-Y 覆盖。

在这里,最好将目录中的所有文件和目录结构都复制出去,而且能保持文件属性是最好的,因此在D:\found.000目录下执行命令xcopy dir0000.chk E:\temp /H /K尝试复制所有文件及目录,其中E:\temp是选择的临时存放位置;复制完成后,经过测试,文件没有损坏,可以正常运行,于是删除D:\found.000\dir0000.chk文件夹,执行rd命令即可:

Microsoft Windows [版本 6.3.9600]
(c) 2013 Microsoft Corporation。保留所有权利。

C:\Windows\system32>rd /?
删除一个目录。

RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。

    /Q      安静模式,带 /S 删除目录树时不要求确认

在目录D:\found.000 下输入rd dir0000.chk /s即可。

其它

当然,在found.000目录中不一定只有一个文件夹或文件(这里如果丢失的文件属于目录,那么会被命名为dir0000.chkdir0001.chk…如果不是目录,那么会被命名为file0000.chkfile0001.chk…),具体情况视磁盘错误情况而定,而一般情况下我们可以按照上面的步骤配合使用dircdxcopy等命令将文件夹恢复,然后根据文件夹内容来确定这个文件夹的本来名称;但是对于文件则比较麻烦,如果不是比较重要的文件,或者文件数目不多且大概可以确定文件类型,也可以按照上面的方法,只是最后使用copy命令复制文件即可,但是复制出来的文件是.CHK类型,所以需要手动修改回本来的扩展名,这里也可以借助网上的一些工具来判断文件类型并自动修改。

当文件都恢复之后,便可以删除found.xxx文件夹了。

最后,如果你想在资源管理器中浏览查看有无类似found.000文件夹,可以进入文件夹选项中取消“隐藏受保护的操作系统文件”选项前的对勾。

上面所说的恢复方式仅仅针对CHK文件而言,也就是你丢失的文件被Windows磁盘修复工具找回来了;但是这些修复工具不是万能的,并不是每次由于磁盘错误造成的文件丢失都能完整的被找回来。至于如果是由于其它情况或者误删文件,那么建议寻找一些专业的恢复工具来找回数据(尽量不要用某些非专业数据恢复工具来和丢失的数据开玩笑),并且在数据恢复之前也尽可能的不往数据所在磁盘中写入数据。

文章目录
  1. 1. 起因
  2. 2. CHK文件
  3. 3. 恢复文件
  4. 4. 其它
  5. 5.