Текущий архив: 2008.04.06;
Скачать: CL | DM;
Вниз
Запись в файл или постепенное схождение с ума :) Найти похожие ветки
← →
Riply © (2008-03-09 20:59) [0]Здравствуйте !
Сходить с ума будем на NTFS следующим образом:
Создаем текстовый файл 65536 байт.
Заполняем его буквой "а".
1. Открываем диск.
2. Находим сектора подопытного файла.
3. Читаем что там находиться в буфер.
4. Подмениваем в середине буфера 15 байт на "Hello Dolly !!!"
5. Записываем буфер обратно на диск (в те же сектора).
2. Закрываем диск.
Теперь читаем этот файл двумя способами:
1. Стандартно, при помощи API
2. Напрямую сектора
В первом случае файл содержит только литеры "а" (!!!),
а во втором, как и ожидалось, в середине файла находим "Hello Dolly !!!".
Перезапускаем Explorer. Читаем снова: результат тотже.
Рестартуем компьютер и снова читаем наш файл.
И первый и второй способы возвращают текст, содержащий "Hello Dolly !!!".
Кто нибудь может мне объяснить что происходит ?
P.S.
На каждом шаге всех операций идет полный контроль:
что сектора у файла не изменились, что мы пишем по тому же смещению,
что и читали, что атрибуты файла не изменились и т.д. и т.п.
Диск можно открывать как с флагом FILE_NO_INTERMEDIATE_BUFFERING так и без него.
Результат тот же.
← →
DrPass © (2008-03-09 21:28) [1]Думаю, ты просто познакомилась с работой дискового кеша...
← →
antonn © (2008-03-09 21:30) [2]я когда читаю посты Ryply ощущаю себя дураком %)
> 1. Стандартно, при помощи API
> 2. Напрямую сектора
так просто, читаем сектора, каждый день читаю сектора после обеда :))
← →
antonn © (2008-03-09 21:30) [3]извиняюсь, что ник неправильно написал :)
← →
antonn © (2008-03-09 21:32) [4]а если кеширование, может есть какой нибудь flush для сброса кеша?
← →
guav © (2008-03-09 21:54) [5]> 1. Стандартно, при помощи API
FILE_FLAG_NO_BUFFERING при записи и чтении используется ?
← →
Игорь Шевченко © (2008-03-09 22:11) [6]
> Здравствуйте !
> Сходить с ума будем на NTFS следующим образом:
Hint: Если заполнить у диска сектор с Partition Table нулями, то разделы диска будут превосходно читаться. До первой перезагрузки.
← →
Loginov Dmitry © (2008-03-09 22:12) [7]Удалено модератором
← →
antonn © (2008-03-09 22:30) [8]Удалено модератором
← →
Loginov Dmitry © (2008-03-09 22:32) [9]Удалено модератором
Примечание: Просто потрепаться в можете в соответствующей конференции
← →
VirEx © (2008-03-10 10:18) [10]Возможно после изменения файла оповестить систему о смене диска, или что-то в этом роде?
← →
Riply © (2008-03-10 11:48) [11]> [1] DrPass © (09.03.08 21:28)
> Думаю, ты просто познакомилась с работой дискового кеша...
Я в душе немного англичанка.
И так как не нашлось никого, кто-бы нас с "Дисковым Кешем"
представил друг-другу, знакомство состоялось в обход общепринятых норм :)
> [2] antonn © (09.03.08 21:30)
> когда читаю посты Ryply ощущаю себя дураком %)
> так просто, читаем сектора
Ерунда.
Просто в данный момент времени я занимаюсь этим, а ты - нет.
Когда ты заговоришь, например, о базах данных, я не пойму ни единого слова :)
> [5] guav © (09.03.08 21:54)
> FILE_FLAG_NO_BUFFERING при записи и чтении используется ?
Упустила этот момент. Мне он казался не столь важным, т.к. с помощью API
я только читала. Проверю.
> [6] Игорь Шевченко © (09.03.08 22:11)
> Hint: Если заполнить у диска сектор с Partition Table нулями, то разделы диска
> будут превосходно читаться. До первой перезагрузки.
Такой простенький Hint, а в скольких вопросах, если и не ставит точки над i,
то уж точно показывает откуда ветер дует :)
Игорь, и где ж Вы были раньше ? :)
Давным-давно я создавала ветку о различии в результатах
при работе разными способами. Эта ветка уже канула в Лету.
Тогда ответа так и не нашли.
Вот небольшая выдержка из нее:
Теперь пытаемся прочитать эту запись с помощю SetFilePointerEx и ReadFile
и выясняем, что по указанному адресу пусто (все забито нулями) или записан мусор.
...........
Теперь пробуем получить эту запись через
DeviceIoControl(hVolume, FSCTL_GET_NTFS_FILE_RECORD, ....
...........
Все совпадает, кроме одного:
в PNTFS_FILE_RECORD_OUTPUT_BUFFER(pOutBuf).FileRecordBuffer мы находим не
мусор, а корректную запись MFT-объекта,
причем именно того, чей ObjUsn мы ей передавали.
Теперь стало понятно где собачка порылась :)
Это плюс. И (для меня) очень большой, ибо не люблю оставлять за спиной непонятое :)
Но есть и минусы:
Результаты всех моих тестов, связанных с механизмом заполнения
системой "лишних" кластеров нулями, пошли коту под хвост.
Спецально написанные для этого ф-ии и процедуры уже уничтожены.
Все надо начинать заново.
← →
Riply © (2008-03-10 11:58) [12]> [4] antonn © (09.03.08 21:32)
> а если кеширование, может есть какой нибудь flush для сброса кеша?
> [10] VirEx © (10.03.08 10:18)
> Возможно после изменения файла оповестить систему о смене диска, или что-то в этом роде?
Не... IMHO, здесь "с нахрапа" брать нельзя.
Надо хорошо понять механизмы работы системы и подстроиться под них,
а не указывать ей, что она должна делать.
P.S.
Еще раз оговорюсь: это только imho, по первому мимолетному знакомству :)
← →
antonn © (2008-03-10 12:05) [13]а если после изменения файла сменить ему имя, апи тоже вернет одни "ааа"?
← →
guav © (2008-03-10 16:36) [14]> [5] guav © (09.03.08 21:54)
> FILE_FLAG_NO_BUFFERING при записи и чтении используется ?
Проверил, и это не поможет. FSCTL_DISMOUNT_VOLUME должно помочь.
> [11] Riply © (10.03.08 11:48)
> Надо хорошо понять механизмы работы системы и подстроиться
> под них,
> а не указывать ей, что она должна делать.
Не думаю что это возможно.
Для обеспечения корректной прямой записи том должен быть заблокирован от записи драйвером фс и другими утилитами, а в случае, когда он заблокирован, проще просто его размонтировать.
← →
Riply © (2008-03-11 06:23) [15]> [14] guav © (10.03.08 16:36)
>> FILE_FLAG_NO_BUFFERING при записи и чтении используется ?
> Проверил, и это не поможет.
Да. У меня такой же результат.
> Не думаю что это возможно.
> Для обеспечения корректной прямой записи том должен быть заблокирован от
> записи драйвером фс и другими утилитами, а в случае, когда он заблокирован, проще просто его размонтировать.
Согласна, но это накладывает на нас очень серьезные ограничения.
Надо подумать, почитать литературу. Я уверена - лазейка должна быть.
IMHO, блокировка диска не является единственным и неповторимым
способом обеспечения корректности прямой записи :)
Пока очень мало информации, ибо я делаю только первые шаги в качестве чукчи-писателя,
до этого была только чукчей-читателем :)
<Offtop
Саш, а почта то у тебя работает ?
Offtop>
← →
Riply © (2008-03-11 07:36) [16]Ну вот и первые проблески.
Видимо, надо смотреть не в сторону диска, а в сторону подопытного файла.
Поступаем так:
Подготовили файл.
Рестартовали.
Теперь главное не трогать подопытного.
Мы знаем, что в нем только литеры "а".
Пишем в него "Hello Dolly" (запись прямая).
Вот теперь его можно открыть обычным способом. И все в полном порядке:
По заказанному нами смещению читаем приветствие для Dolly :)
Т.е. если до нас файл никто не трогал, то все в порядке.
Допустим его "трогали".
Как можно сказать системе, что содержимое данного файла обновилось ?
← →
VirEx © (2008-03-11 16:46) [17]
> Как можно сказать системе, что содержимое данного файла
> обновилось ?
изменить атрибут или установить размер
← →
Последний доброхот (2008-03-11 17:28) [18]Использовать функцию FlushFileBuffers?
← →
Игорь Шевченко © (2008-03-11 17:30) [19]
> Как можно сказать системе, что содержимое данного файла
> обновилось ?
Она сама знает. Зачем ей говорить ?
Страницы: 1 вся ветка
Текущий архив: 2008.04.06;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.006 c