代码之家  ›  专栏  ›  技术社区  ›  Marus Gradinaru

我可以将文件写入特定的群集位置吗?

  •  0
  • Marus Gradinaru  · 技术社区  · 5 年前

    您知道,当应用程序打开一个文件并对其进行写入时,系统会选择存储在哪个集群中。我要选择我自己!让我告诉你我真正想做什么。。。事实上,我不一定要写什么。我有一个硬盘在中间有一个坏的集群范围,我想标记这个空间,因为它被一个文件占用,并最终将它设置为一个隐藏的不可移动的系统(如windows中的页面文件),这样它就不会被访问了。有什么办法吗?

    以后编辑: 我想 THIS 是我最后的希望。我刚找到,但我需要调查。。。也许可以在任何地方创建一个文件,然后重新定位到所需的集群。但是这需要写,如果集群坏了,函数可能会失败。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Rob Lambden    5 年前

    我相信对于您的特定问题:“我可以将文件写入特定群集位置吗”的答案通常是“否”。

    原因是,现代操作系统的体系结构是分层的,因此底层磁盘存储的访问级别低于您可以访问的级别,当然,磁盘可以以不同的方式格式化,因此将有支持不同格式的不同内核模式驱动程序。即便如此,智能磁盘控制器仍然可以重新映射内核模式驱动程序使用的地址。简言之,有太多可能的重定向级别,您无法确保您的干预是在正确的级别上进行的。

    如果您谈论的是Windows—您没有说明,但似乎是假设的—那么您需要了解内核中的存储驱动程序(请参阅 https://docs.microsoft.com/en-us/windows-hardware/drivers/storage/ https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/_ifsk/ ). 这实际上是一个“过滤器”,因为它位于IO请求链中,可以拦截和更改IO请求包(IRP)。当然,这将在内核中运行,而不是在用户空间中,通常这将是用C编写的,我注意到您的问题被标记为Delphi。

    您的IFS驱动程序可以位于请求链的不同级别。我使用这种技术截获对特定文件系统位置(路径/文件名)的调用,并更改IRP,以便虚拟化请求—甚至从内核回调到用户空间,以解决如何处理请求。使用提供的示例实现IFS驱动程序的基本功能并不太复杂,因为它是一个过滤器,而不是一个完整的storgae系统。

    然而,这种方法的本质意味着另一个过滤器也可以改变您在驱动程序中所做的事情。

    编辑 关于OP的建议 FSCTL_MOVE_FILE

    对于简单的环境,这可能会做你想做的,它的目的是支持碎片整理过程。

    您将注意到,从您链接到它的页面上可以看到它正在移动 一个文件的一个或多个虚拟群集在同一卷内从一个逻辑群集到另一个逻辑群集

    这是一个传递给我在上面提到的底层存储驱动程序的代码。存储层做什么取决于存储层,并取决于底层技术。对于更高级的存储,不能保证这实际上解决了 身体的 我相信你的问题是关于什么地点的。

    但是,这完全取决于底层存储系统。对于某些类型的存储,操作系统可能不会以同样的方式进行重新定位。以具有内置数据分层功能的企业存储阵列为例。在不知道操作系统的情况下,数据将根据分层算法在存储中重新定位。还要考虑到有些技术允许直接访问数据(如NVMe),并且您使用的是“虚拟”和“逻辑”集群,而不是物理位置。

    但是,您可能会发现,在一个简单的情况下,在底层驱动程序中提供支持,并且在操作系统和内核之外不进行重新映射,这就满足了您的需要。

        2
  •  1
  •   fpiette    5 年前

    因为您的问题是标记坏集群,所以不需要编写任何程序。使用命令行实用程序 CHKDSK Windows提供的。

    chkdsk /r c:
    

    检查将在下次重新启动时完成。

    documentation .

    推荐文章