Получить физический адрес файла на диске

Используя Windows API, я пытаюсь написать программу для чтения данных с диска. Мне удалось получить доступ к содержимому диска с помощью CreateFile и я могу искать через это. Допустим, на этом диске есть несколько файлов, и я знаю их пути, но на самом деле меня интересует их физическое местоположение.

Мой вопрос:
Можно ли получить физическое местоположение или адрес файлов (или сектора, в котором они находятся) и где они хранятся на диске, не выполняя поиск по всему диску? Если так, какие функции я должен использовать? С помощью SetFilePointer или же FindFirstFile Похоже, не решить проблему тоже.

-2

Решение

Весь смысл любой файловой системы заключается в Аннотация секторы физического диска и предоставляют вам более высокий уровень абстракции (называемые файлами). Таким образом, ответ на вопрос «Можно ли получить физическое местоположение» должен быть нет! (в общем); некоторый код может даже переехать сектора файла (например, дефрагментатор диска и вы можете представить, что он работает одновременно с вашей программой, даже если это не рекомендуется ..)

Подробнее читайте в вики файловые системы а также файлы, затем прочитайте хорошую книгу, такую ​​как Операционные системы: три легкие части

Обратите внимание, что при использовании файлов вы ожидаете, что ваша программа будет вести себя аналогично после перемещения файловой системы на другой диск, при условии, что пути к файлам, их содержимое и метаданные останутся прежними. В частности, вы можете иметь два внешних USB диски корпуса с различной геометрией или емкостью, имеющей так же содержимое файла (возможно, даже в разных файловых системах, например, VFAT в одной и NTFS в другой), и вы затем ожидаете, что ваша программа будет вести себя одинаково при доступе к таким файлам (в первом окне или во втором). Независимо от того, какой блок подключен, ваша программа (например) будет иметь доступ к тому же F:\MyDir\MyFile.dat файл. Что касается файловых систем, оба поля будут выглядеть одинаково. На уровне физического сектора данные будут организованы совсем по-другому.

Кстати, физическая организация файлов внутри файловой системы сильно варьируется от одной файловой системы к другой. Вы могли бы использовать некоторые Ext3 файловая система на вашем компьютере (так как есть Ext3 драйверы для Windows) — и это действительно полезно для обмена некоторыми данными между Linux & Windows на ПК с двойной загрузкой, и организация файлов отличается от ЖИР один или NTFS один.

Вы можете получить какой-либо способ запросить ядро, чтобы узнать фактическое местоположение физического сектора. Но я не уверен, что это работает для всех файловых систем (что означало бы расположение сектора для некоторой удаленной NFS). И эта информация может быть устаревшей до того, как ваша программа ее получит (например, если какой-то дефрагментатор работает параллельно). Кроме того, другие процессы могут одновременно обращаться к одной и той же файловой системе и изменять ее (так что метаданные, например местоположение сектора, будут устаревшими к тому времени, когда запланирован запуск вашего процесса).

В Windows и Unix-подобных системах код файловой системы выполняется в ядре. И другие процессы могут использовать тот же код (и ту же файловую систему), пока ваш процесс не запущен. И Windows, и Unix имеют упреждающее планирование, поэтому у вас нет гарантии, что ваш процесс снова запустится в пользовательском режиме, прежде чем какой-либо другой процесс будет использовать ту же файловую систему.

Помните, что на практике данные вашего файла часто остаются в кеш страниц. И именно поэтому вы можете не слышать, как работает ваш диск — если у вас все еще есть вращающийся жесткий диск — при доступе к одному и тому же файлу несколько раз подряд (например, запуск одной и той же программы в одном и том же файле дважды, с интервалом в несколько секунд; обычно Второй запуск — это сохранение диска в молчании, поскольку данные файла уже находятся в оперативной памяти).

В комментарии вы упоминаете, что хотите

Чтобы просмотреть данные файла и, например, посмотреть, что происходит с данными, когда они удаляются или изменяются.

но это должно работать на уровне файловой системы. Linux имеет Inotify (7) средства для этого (они работают на большинстве местный файловые системы, например Ext4 или BTRFS, но не включен дистанционный пульт файловые системы а-ля NFS (5), и ни в псевдофайловых системах Proc (5)). Я не знаю, есть ли в Windows что-то похожее на Linux inotify (но, вероятно да, по крайней мере, в некоторых случаях).

Вы, вероятно, должны рассмотреть возможность использования некоторой базы данных (может быть так же просто, как SQLite) и, возможно, вы хотите ACID свойства (затем использовать некоторые реальные RDBMS как PostGreSQL). С PostGreSQL вы могли бы использовать TRIGGERs знать, что некоторые данные изменились, даже если некоторые Другой Программа изменяет ту же базу данных.

Вы также можете сделать некоторые блокировка файла, и принять условность тот каждый Программа, обращающаяся к вашему конкретному файлу, должна заблокировать его соответствующим образом.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]