我想通过Java从磁盘恢复文件而不使用本机库
我正在使用Java 8进行此操作
据我所知,已删除的文件会保留在磁盘上,直到被覆盖为止
我可以直接访问Linux上的磁盘,并且可以读取原始数据,但是,例如,如何解析ext4或NTFS文件系统上的已删除文件?
谢谢。
要恢复已删除的文件,需要了解底层文件系统的实现方式,因此您需要做一些阅读工作,然后才能到达任何地方。
从理论上讲,是的,您绝对可以使用纯Java来做到这一点。您只需要了解如何绕过文件系统从原始磁盘读取数据即可。在Unix系统上,这很简单:将设备节点作为文件打开(您需要root
权限)并进行读取。在Windows上,可能有类似的过程。最糟糕的是,您将不得不使用C或C++创建一个帮助程序库来为您读取数据。
一旦可以访问原始数据,请查找文件在特定文件系统中的存储方式,并开始在读取的数据中寻找相似的模式。
但这不是您下午可以做的事情。
更新:如何绕过文件系统。
在Unix系统上,您可以像这样从分区或卷中读取:
InputStream sda1 = new FileInputStream("/dev/sda1");
int firstByte = sda1.read();
在Windows上,您可以从阅读
\\.\PhysicalDisk0
。从命名文件,路径和命名空间:
使用Win32设备名称空间的另一个示例是将
CreateFile
函数与“ \\。\
PhysicalDiskX”(其中X是有效的整数值)或“ \\。\
CdRomX”一起使用。这样,您可以绕过文件系统直接访问那些设备。之所以可行,是因为这些设备名称是由系统在枚举这些设备时创建的,并且某些驱动程序还将在系统中创建其他别名。例如,实现名称“
C:\”的设备驱动程序具有自己的名称空间,该名称空间也恰好是文件系统。通过该
CreateFile
函数的API 通常使用“ \\。\”前缀,因为CreateFile
该函数用于打开文件和设备,具体取决于您使用的参数。如果使用Windows API函数,则应使用“ \\。\”前缀仅访问设备,而不访问文件。
大多数API不支持“ \\。\”;只有那些旨在与设备名称空间一起使用的设备才能识别它。请务必检查每个API的参考主题,以确保正确。
我不知道Java
API是否使用来实现,CreateFile
或者它是否进行了某些名称修饰,这意味着您无法访问设备名称空间。在最坏的情况下,您将不得不创建一个包装器库,该包装器调用CreateFile
并将其返回的HANDLE转换为可在Java中使用的文件描述符。根本没有工作。
我通过Anaconda找到了iPython笔记本。我不小心删除了一个重要的笔记本,但我似乎在垃圾箱里找不到它(我认为iPy笔记本不会被扔进垃圾箱)。 有人知道我怎样才能找回笔记本吗?我正在使用MacOSX。 谢谢
如何恢复连接?希望不完全重新安装我的postgres?? 非常感谢:)
问题内容: 我完全没有使用Windows API的经验,所以请原谅我的无知。 我想删除文件到回收站。如何使用JNA做到这一点,以及如何检测是否不可能(例如,由于文件位于网络共享上)? 问题答案: 使用已定义和方法的。
我的项目运行正常。我只是做了一次Lint检查,它给了我所有项目的错误。所以我刚刚清理了我的项目。但现在它并没有生成R.java文件。我怎样才能找回它。我试着建造。。但它不起作用
我在服务器中执行docker()清洁命令: 令我惊讶的是,这个命令删除了停止的容器。这就是问题所在,有些容器因为某种原因停止了,但我仍然想在未来使用它。现在它被删除了,有没有可能恢复错误删除的停止的容器?
问题内容: 作为我正在做的项目的一部分,我想清理我生成的重复行条目的文件。但是,这些重复项通常不会彼此靠近发生。我想出了一种用Java执行此操作的方法(基本上是复制文件,然后使用嵌套的while语句将一个文件中的每一行与其他文件中的每一行进行比较)。问题是我生成的文件很大而且文本很重(大约22.5万行文本,大约40兆)。我估计目前的程序需要63个小时!这绝对是不可接受的。 但是,我需要一个集成的解