Программно определить статус фрагментации файла

Можно ли определить статус фрагментации конкретного файла (то есть количество отдельных фрагментов, которые занимает этот файл)? Если да, то как это можно сделать с помощью .net?

Мотивация такова: мое приложение хранит данные в FileStream, изменяя его размер по требованию. Это в конечном итоге приводит к фрагментации файла. Я хотел бы отслеживать статус фрагментации файла и на его основе принимать решение о том, следует ли копировать файл и заменять его новым файлом (таким образом, «дефрагментировать» его без внесения изменений в MFT).


person M.A. Hanin    schedule 26.03.2010    source источник
comment
В Linux это возможно с помощью системного вызова, который использует filefrag, ioctl(FIEMAP). Поддерживается большинством дисковых файловых систем, но не через NFS.   -  person Peter Cordes    schedule 16.11.2019


Ответы (1)


Это прямо относится к категории «преждевременной оптимизации». Совсем не гарантируется, что вы вызовете фрагментацию, на диске вполне могут быть незафиксированные кластеры за концом файла, и часто это происходит. Возможно, дело в том, что в .NET framework нет ничего, что позволило бы обнаружить или исправить это. Для доступа к MFT тома требуется неуправляемый код и права администратора.

Дефрагментация диска — это обычная задача обслуживания машины. Это стало автоматическим с Win7.

person Hans Passant    schedule 26.03.2010
comment
3. я не предполагаю фрагментацию, я предполагаю, что это возможно, и я ищу способ опровергнуть или проверить свои подозрения во время выполнения. 4. Я мог бы пойти очень уродливым путем, активировав дефрагментацию и проверив файл журнала... но это действительно уродство. 5. Могу точно сказать, мои клиенты не дефрагментируют свои диски, и большинство до сих пор используют WinXP. @Марк Рэнсом, я бы хотел получить SSD, и я бы хотел получить по одному для каждого из моих клиентов. Возможно, лет через десять фрагментация файлов станет устаревшей. Тем временем... - person M.A. Hanin; 26.03.2010
comment
@nobugz, в конце концов, вы, вероятно, правы, это, вероятно, преждевременная оптимизация. Тем не менее, я хотел бы получить ответ на сам вопрос (без учета мотивации) - person M.A. Hanin; 26.03.2010
comment
Я бы порекомендовал вам задать другой вопрос: как я могу определить степень фрагментации в Windows, не упоминая управляемый код. - person Hans Passant; 26.03.2010