|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Куда пишется информация до момента закрытия файла?
Этот вопрос меня волнует уже давно. Поясню ситуацию.
Представте себе асбтрактный диск А объемом 1024 Кб (1 Мб). На нем лежит один-единственный файл размером 900 Кб. Свободный размер составляет соответственно 124 Кб (пусть у нас идеальная ФС). Я открываю этот файл для ПЕРЕЗАПИСИ. И начинаю писать. Пишу-пишу килобайт на 500. А потом НЕ ЗАКРЫВАЮ файл. Вопрос: Где храняться (хранились) эти 500 Кб до момента закрытия? Т.е. если я закрою файл то он станет равен 500 Кб, а высвободившееся пространство станет 524 Кб. Если не закрою — все останется как прежде: 900/124. Куда пишутся эти злосчастные 500 Кб, если на момент записи на диске свободно лишь 124 Кб и в свободный размер он не влезает по определению. Можно отмазаться — в кеш на диске. Но предположим, у меня не килобайты, а мегабайты. Никакого кеша не хватит. Кто знает ответ на вопрос — помогите. Очень хочется понять этот момент, а в доступной литературе подобные моменты я не встречал. Заранее спасибо. |
#2
|
||||
|
||||
Кеш составляет не килобайты, а как раз мегабайты, и при нужде система выделит ещё, по возможности.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
Мой кеш WD составляет 64 мегабайта. При размере файла в 500 мегабайт, где подсасывать пространство.
|
#4
|
||||
|
||||
Какое отношение имеет системный кеш к кешу харда?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
А какой Кеш ты имел ввиду?
|
#6
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
На 99% уверен что нет. Индикатор носителя показывает запись. В файл подкачки сливается только оперативка. А запись в файл - отдельная тема. Тесты с 2 Гб флешкой об этом говорят. Как закончу эксперимент - выложу результаты, машину, ос и сам ход эксперимента. Может кто поможет разобраться.
|
#8
|
||||
|
||||
Счастливых экспериментов.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
RootDev (14.02.2012)
|
#9
|
|||
|
|||
Для эксперимента было использовано:
4Gb флешка Transcend (файловая система FAT) Операционная система Windows XP x64 SP 2. Приложение, написанное на Дельфи 7 версии. (файл объявлялся как textfile и писался построчно, порциями по 100 Кб.) Суть эксперимента такова. 1) Флешка забивается файлами разной длины, от 100 до 900 мегабайт, оставляя свободным около 30 Мегабайт. 2) После чего, приложение открывает выбранный 700 Мб файл на флешке, начинет в него запись порядка 300 мегабайт, но не закрывает файл и завершается. Результат очень удивил: Файл изменил свой размер с 700 до, впринципе ожидаемых 300 мегабайт, высвободив 400 Мб свободного пространства. Более того, системный кеш начал интенсивно набирать размеры и увеличился, в среднем, на 200 Мб. Сработал принцип отложеной записи. Приложение дало команду на запись 300 метров в файл, успешно получило подтверждение на запись и продолжило работу, в то время как система сбросила эти данные в кеш, и, уже в фоне продолжала активно писать на флешку, о чем свидетельствовал постоянно увеличивающийся размер файла и мерцающий индикатор записи на самом носителе. При этом сам исполняемый файл сообщил, что работу он закончил. Итоги. При записи данных в файл, который имеет определенную длинну, так и вновь созданный, все данные в файле затираются новыми, при этом не имеет значения, вызываете вы метод closefile или нет. Данные попадут в файл в любом случае, затерев предыдущие. Фактически, это дает основание полагать что функция closefile просто уничтожает указатель на файл и объявляет системе, что данный файл свободен. Обращаю внимание — что ПО реализовывалось в Delphi 7. Методы Visual Studio и прочих сред разработки могут отличаться — не тестировал. Последний раз редактировалось RootDev, 14.02.2012 в 00:23. |
#10
|
||||
|
||||
Цитата:
Если не хочется отложенной записи, то для файлов объявленных как textfile, имеется функция Flush, принуждающая сбросить весь кеш в файл немедленно. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
На самом деле не совмем так.
Функция closefile освобождает хэндл, но перед этим так же дает команду на сброс буфера. Т.е. ситуация, когда программа не закрывает файл черевата тем, что последний чанк не будет записан в файл. |
#12
|
|||
|
|||
Да, файл открыт Rewrite. Тут дело даже не в отложенной записи, за Flush спасибо, буду знать.
Тут же возникает вопрос, почему (и довольно часто) в литературе, (взятой, например с этого источника) упоминается часто слудеющее Цитата:
Ну и так далее. Это сильно вводит в заблуждение и, по сути, это дает основание утверждать, что изменения сохраняется только при CloseFile. А на практике иначе. Прямо во время записи. Да и задача стояла иная - первый пост. Теперь все ясно. Любое обращение к файлу на перезапись/дозапись вызывает изменения содержания. За дальнейшие замечания и восполнение пробелов буду благодарен, Angvelem, за соучастие спасибо отдельное. |
#13
|
||||
|
||||
По указанной ссылке, не совсем грамотно оисано действие функции CloseFile. Вообще сообщения такого рода нужно сравнивать с описаниями из других источников и не забывать, конечно, про встроенную справку.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |