使用Windows API,我正在尝试编写一个程序以从磁盘读取数据。我设法使用CreateFile访问驱动器的内容,并且能够对其进行搜索。假设该磁盘上有一些文件,我知道它们的路径,但实际上我对它们的物理位置很感兴趣。
我的问题是: 是否可以在不搜索整个驱动器的情况下检索文件(或文件所在的扇区)的物理位置或地址以及它们在驱动器中的存储位置?如果是这样,我应该使用哪些功能?使用SetFilePointer或FindFirstFile似乎也无法解决问题。
答案 0 :(得分:1)
任何文件系统的重点是提取物理磁盘扇区,并为您提供更高级别的抽象(称为文件)。因此,“是否有可能检索物理位置”的答案应该是否!(通常);某些代码甚至可以移动文件的扇区(例如disk defragmenter,即使不建议这样做,您也可以想象它与程序并发运行。)
要了解更多信息,请阅读file systems和files上的Wikipage,然后阅读诸如Operating systems: Three Easy Pieces这样的好书
请注意,如果文件路径,内容和元数据保持不变,则通过使用文件,您希望程序在将文件系统移至其他磁盘后的行为类似。特别是,您可能有两个外部USB disks enclosures,它们具有不同的几何形状或容量,具有相同的文件内容(也许甚至在不同的文件系统中,例如,一个上的VFAT,另一个上的NTFS),以及然后,您希望您的程序在访问此类文件时(在第一个或第二个框中)表现相同。无论插入哪个框,您的程序都将(例如)访问相同的F:\MyDir\MyFile.dat
文件。作为文件系统,两个方框看起来都相同。在物理部门一级,数据的组织方式将有很大不同。
顺便说一句,文件系统中文件的物理组织从一个文件系统到另一个文件系统都大不相同。您可以在计算机上使用一些Ext3文件系统(因为Windows使用Ext3 drivers),这对于在双启动PC上的Linux和Windows之间共享某些数据非常有用,并且该文件组织不同于FAT或NTFS的组织。
您可能会获得一些查询内核的方法,以获取实际的物理扇区位置。但是我不确定它是否适用于所有文件系统(某些远程NFS的扇区位置是什么意思)。而且这些信息在您的程序获得之前可能是过时的(例如,如果某些碎片整理程序正在并行工作)。另外,其他进程可以同时访问和修改相同的文件系统(这样,在计划再次运行该进程时,元数据(例如扇区位置)将被废弃)。
在Windows和类似Unix的系统上,文件系统代码在内核中运行。在您的进程未运行时,其他进程可以使用相同的代码(和相同的文件系统)。 Windows和Unix都有抢占式调度,因此您不能保证在其他进程正在使用同一文件系统之前,您的进程将再次在用户模式下运行。
请记住,实际上,您的文件数据通常位于page cache中。这就是为什么当连续访问同一文件多次(例如,对同一文件运行两次相同的程序,间隔几秒钟)时,如果仍然有旋转的硬盘,则可能听不到磁盘工作的原因。第二个运行是使磁盘保持静默状态,因为文件数据已经在RAM中。
在评论中,您提到自己想要
要观看文件的数据,例如查看数据被删除或修改后会发生什么情况。
,但这应该在文件系统级别起作用。 Linux为此具有inotify(7)工具(它们可以在大多数 local 文件系统上运行,例如Ext4或BTRFS,但不能在 remote 文件系统上运行,{{3} },在伪文件系统àla nfs(5)上都没有。我不知道Windows是否具有与Linux inotify
类似的东西(但至少在某些情况下可能为proc(5))。
您可能应该考虑使用一些数据库(可能像yes一样简单),也许您想要sqlite属性(然后使用一些真实的ACID PostGreSQL)。使用RDBMS,您可能会使用TRIGGER
来知道某些数据已更改,即使某些 other 程序更改了同一数据库。
您还可以执行一些PostGreSQL,并采用惯例,即每个程序访问您的特定文件都应将其适当锁定。