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

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

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


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

Для получения дополнительной информации прочтите википедии о файловых системах и файлах, а затем прочтите хорошую книгу, например Операционные системы: три простых элемента

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

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

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

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

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

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

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

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

Вероятно, вам стоит подумайте об использовании некоторой базы данных (может быть, такой же простой, как sqlite), и, возможно, вам нужны свойства ACID (затем используйте настоящую СУБД, такую ​​как PostGreSQL). В PostGreSQL вы можете использовать TRIGGER , чтобы знать, что некоторые данные изменились, даже если какая-то другая программа изменяет ту же базу данных.

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

12



Как реорганизовать физическое расположение папки/файла на диске

У меня есть диск WD Velociraptor, заполненный на 80%. Дело в том, что диски Velociraptor работают очень быстро (для вращающегося диска), но скорость уменьшается по мере того, как данные находятся на диске. Дело в том, что у меня есть некоторые вещи, которые я хочу быстро прочитать (Window/GTA V/Starcitizen), и другие вещи, которые меня не особо волнуют (Office/Visual Studio). Проблема в том, что по историческим причинам многие желаемые файлы находятся дальше снаружи, а менее желательные — внутри.

Есть ли способ переместить файлы/папки на диске с помощью вручную определенного приоритета доступа?

(Да, я знаю, просто купите SDD и покончим с этим … Я, вероятно, скоро займусь этой системой, но мне было интересно, смогу ли я сделать то, что у меня нет в то время будучи.)


У дефрагглера Piriform есть опция, которую вы можете использовать:


Вы не можете напрямую управлять физическим размещением файлов в томе. Однако вы можете влиять на это . Лучший способ сделать это — использовать такой инструмент, как GParted или что-то подобное с загрузочного компакт-диска Linux, чтобы сжать раздел, а затем переместить его в конец диска. Таким образом у вас будет свободное место в начале Если вы создадите новый раздел в этом свободном пространстве, все, что вы храните на нем, будет гарантированно находиться в передней части диска, где вы этого хотите.

Исторический забавный факт:

По умолчанию для большинства дистрибутивов Linux создается отдельный раздел подкачки в начале диска именно по этой причине. Файл подкачки широко используется, и вы хотите, чтобы он был быстрым и непрерывным.

Оцените статью
clickpad.ru
Добавить комментарий