Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

Запись в файл или постепенное схождение с ума :)   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
6-1184321913
Alexey_k
2007-07-13 14:18
2008.04.06
Подсчёт инет-трафика


2-1205054806
dmitry_12_08_73
2008-03-09 12:26
2008.04.06
Как загрузить курсор из файла *.res


2-1205412649
Vinum
2008-03-13 15:50
2008.04.06
Как отловить правый клик мыши


2-1205045267
Maks_
2008-03-09 09:47
2008.04.06
Как запустить секундомер?


4-1185992588
DelphiKettle
2007-08-01 22:23
2008.04.06
Как работать с купюроприемником?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский