Появилось время - попробовала проверить предположения из этой ветки.
Результаты предварительных опытов:
Тестировалось на двух фрагментированных дисках
IOMEGA ZIP 100 PartitionLength = 100 646 912
SUMSUNG SP2001H PartitionLength = 1 077 479 424
Файловая система и там и там: NTFS v 3.1
Работаем под WinXP SP2
Предварительно на каждом размещалось по три (не фрагментированных) файла,
со следующими характеристиками:
IOMEGA ZIP 100:
FILE_NAME_WIN32 = 1_1048576.txt
FileSize 1048576
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 92674 Count 2048
FILE_NAME_WIN32 = 16_1048576.txt
FileSize 1048576
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 26640 Count 2048
FILE_NAME_WIN32 = 32_1048576.txt
FileSize 1048576
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 98687 Count 2048
SUMSUNG SP2001H:
FILE_NAME_WIN32 = 0_8388608.txt
FileSize 8388608
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 241293 Count 4096
FILE_NAME_WIN32 = 16_8388608.txt
FileSize 8388608
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 45060 Count 4096
FILE_NAME_WIN32 = 32_8388608.txt
FileSize 8388608
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 110596 Count 4096
Далее, на них дважды поблочно (BytesPerBlock = MAXWORD - 1) копировалася файл.
В первом случае - с предварительным использованим (на весь требуемый размер),
NtSetInformationFile(...FILE_END_OF_FILE_INFORMATION...)
NtSetInformationFile(...FILE_ALLOCATION_INFORMATION...)
во втором - "обычное" копирование
В результате были получены следующие файлы:
IOMEGA ZIP 100:
FILE_NAME_WIN32 = FragmentFile_37748736.txt - "SetEnd" копирование
TypeCode AT_DATA
RecordLength 72
FormCode NONRESIDENT
Flags STANDART
Instance 4
LowestVcn 0
HighestVcn 73727
MappingPairsOffset 64
_CompressionUnit 0
AllocatedLength 37748736
FileSize 37748736
ValidDataLength 37748736
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 100735 Count 73728
FILE_NAME_WIN32 = FragmentFile_37748736.txt - "обычное" копирование
TypeCode AT_DATA
RecordLength 96
FormCode NONRESIDENT
Flags STANDART
Instance 4
LowestVcn 0
HighestVcn 73727
MappingPairsOffset 64
_CompressionUnit 0
AllocatedLength 37748736
FileSize 37748736
ValidDataLength 37748736
RETRIEVAL_POINTERS
ExtentCount 5
Lcn 90626 Count 2048
Lcn 94722 Count 3565
Lcn 16 Count 26624
Lcn 28688 Count 32725
Lcn 100735 Count 8766
SUMSUNG SP2001H:
FILE_NAME_WIN32 = FragmentFile_301989888.txt - "SetEnd" копирование
TypeCode AT_DATA
RecordLength 72
FormCode NONRESIDENT
Flags STANDART
Instance 4
LowestVcn 0
HighestVcn 147455
MappingPairsOffset 64
_CompressionUnit 0
AllocatedLength 301989888
FileSize 301989888
ValidDataLength 301989888
RETRIEVAL_POINTERS
ExtentCount 1
Lcn 263178 Count 147456
FILE_NAME_WIN32 = FragmentFile_301989888.txt - "обычное" копирование
TypeCode AT_DATA
RecordLength 96
FormCode NONRESIDENT
Flags STANDART
Instance 4
LowestVcn 0
HighestVcn 147455
MappingPairsOffset 64
_CompressionUnit 0
AllocatedLength 301989888
FileSize 301989888
ValidDataLength 301989888
RETRIEVAL_POINTERS
ExtentCount 5
Lcn 261775 Count 1281
Lcn 245389 Count 16384
Lcn 4 Count 45056
Lcn 114692 Count 57019
Lcn 49156 Count 27716
Т.е. нам удалось выяснить, что в условиях проведения эксперимента,
при поблочном копировании и использовании сабжевых ф-ий
1. Кластеры выделяются в SetEndOfFile (у мнея не совсем SetEndOfFile, но что-то типа того :)
2. "лишних" действий по "забиванию" кластеров нулями ни при SetEndOfFile, ни при записи,
ни при закрытии файла не производиться. (Реально в кластерах мусор, хоть и читаются нули).
3. Если позволяет место, то создается дефрагментированный файл, в отличие от "обычного" копирования.
На этот момент все.
Выводы делайте сами :)
P.S.
Тестировалось на устаревших дисках. Может, для других, и не так все будет.
Была бы рада, если бы кто-то попробовал и рассказал о результатах :)