Конференция "WinAPI" » Использование SetFilePointer и SetEndOfFile.
 
  • Riply © (16.02.08 16:41) [20]
    > [19] guav © (16.02.08 16:13)
    > А вот не надо. Если записали больше, то незачем вызывать SetFileValidData.
    > Если записали меньше, то вообще логичнее теперь укоротить файл,
    > а если длина устраивает то не всё равно ли что в конце - виртуальные нули или мусор ?

    С первыми утверждениями сложно не согласиться :)
    А вот последнее - это смотря как читаешь.
    И потом, сама система забивает нулями.
    Наверное у нее есть веские соображения в пользу этого,
    раз она идет на лишние телодвижения :)

    > Ну так, это же часть файла :) Я думаю что даже при дефрагментации
    > (начиная с ХР, понятно, 2000 просто не дефрагментировала за ValidDataLength)
    > неинициализированные кластера будут поддерживаться.
    Ну и что, что часть файла ? Ведь система считает, что все равно выдаст нули пользователю.
    Значит может и изменить эти никому не нужные данные.

    > Что интересно - не "зная" об этой фичи, MFT_Scan читает эти "секретные" данные,
    > а если бы знал можно было бы сделать чтобы не читал.

    Саш, у тебя сохранилась та старая версия MFT_Scan - а ?
    Сотри ее немедленно ! Мне за нее стыдно.
    Скоро, в замен, другая будет готова :)

    P.S.
    А секретными он (MFT_Scan) априори считает все данные,
    которые предоставляются пользователю в "ненастоящем виде" :)
    Тем более мы убедились, что они и вправду "секретные" :)
  • Riply © (21.02.08 10:08) [21]
    Появилось время - попробовала проверить предположения из этой ветки.
    Результаты предварительных опытов:
    Тестировалось на двух фрагментированных дисках
    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.
    Тестировалось на устаревших дисках. Может, для других, и не так все будет.
    Была бы рада, если бы кто-то попробовал и рассказал о результатах :)
 
Конференция "WinAPI" » Использование SetFilePointer и SetEndOfFile.
Есть новые Нет новых   [134431   +15][b:0][p:0.002]