Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.02.2012, 22:33
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
Лампочка Куда пишется информация до момента закрытия файла?

Этот вопрос меня волнует уже давно. Поясню ситуацию.

Представте себе асбтрактный диск А объемом 1024 Кб (1 Мб). На нем лежит один-единственный файл размером 900 Кб. Свободный размер составляет соответственно 124 Кб (пусть у нас идеальная ФС). Я открываю этот файл для ПЕРЕЗАПИСИ. И начинаю писать. Пишу-пишу килобайт на 500. А потом НЕ ЗАКРЫВАЮ файл.

Вопрос: Где храняться (хранились) эти 500 Кб до момента закрытия?

Т.е. если я закрою файл то он станет равен 500 Кб, а высвободившееся пространство станет 524 Кб. Если не закрою — все останется как прежде: 900/124. Куда пишутся эти злосчастные 500 Кб, если на момент записи на диске свободно лишь 124 Кб и в свободный размер он не влезает по определению. Можно отмазаться — в кеш на диске. Но предположим, у меня не килобайты, а мегабайты. Никакого кеша не хватит. Кто знает ответ на вопрос — помогите. Очень хочется понять этот момент, а в доступной литературе подобные моменты я не встречал. Заранее спасибо.
Ответить с цитированием
  #2  
Старый 13.02.2012, 22:40
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Кеш составляет не килобайты, а как раз мегабайты, и при нужде система выделит ещё, по возможности.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 13.02.2012, 22:44
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
По умолчанию

Мой кеш WD составляет 64 мегабайта. При размере файла в 500 мегабайт, где подсасывать пространство.
Ответить с цитированием
  #4  
Старый 13.02.2012, 22:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Какое отношение имеет системный кеш к кешу харда?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 13.02.2012, 23:02
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
По умолчанию

А какой Кеш ты имел ввиду?
Ответить с цитированием
  #6  
Старый 13.02.2012, 23:12
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
Какое отношение имеет системный кеш к кешу харда?
Этот.____
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 13.02.2012, 23:16
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
По умолчанию

На 99% уверен что нет. Индикатор носителя показывает запись. В файл подкачки сливается только оперативка. А запись в файл - отдельная тема. Тесты с 2 Гб флешкой об этом говорят. Как закончу эксперимент - выложу результаты, машину, ос и сам ход эксперимента. Может кто поможет разобраться.
Ответить с цитированием
  #8  
Старый 13.02.2012, 23:23
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Счастливых экспериментов.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
RootDev (14.02.2012)
  #9  
Старый 14.02.2012, 00:17
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
Счастье

Для эксперимента было использовано:

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  
Старый 14.02.2012, 00:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от RootDev
...При записи данных в файл, который имеет определенную длинну, так и вновь созданный, все данные в файле затираются новыми...
А чего ты ждал, файл, я так понимаю, был открыт как Rewrite?

Если не хочется отложенной записи, то для файлов объявленных как textfile, имеется функция Flush, принуждающая сбросить весь кеш в файл немедленно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 14.02.2012, 00:55
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На самом деле не совмем так.
Функция closefile освобождает хэндл, но перед этим так же дает команду на сброс буфера. Т.е. ситуация, когда программа не закрывает файл черевата тем, что последний чанк не будет записан в файл.
Ответить с цитированием
  #12  
Старый 14.02.2012, 01:04
RootDev RootDev вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 7
Версия Delphi: 7
Репутация: 10
По умолчанию

Да, файл открыт Rewrite. Тут дело даже не в отложенной записи, за Flush спасибо, буду знать.
Тут же возникает вопрос, почему (и довольно часто) в литературе, (взятой, например с этого источника) упоминается часто слудеющее
Цитата:
После закрытия файла процедурой CloseFile, все данные, записанные до этого в файл, сохраняются. Переменная типа TFile может после этого связываться с другим физическим файлом.


Ну и так далее. Это сильно вводит в заблуждение и, по сути, это дает основание утверждать, что изменения сохраняется только при CloseFile. А на практике иначе. Прямо во время записи. Да и задача стояла иная - первый пост. Теперь все ясно. Любое обращение к файлу на перезапись/дозапись вызывает изменения содержания. За дальнейшие замечания и восполнение пробелов буду благодарен, Angvelem, за соучастие спасибо отдельное.
Ответить с цитированием
  #13  
Старый 14.02.2012, 01:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

По указанной ссылке, не совсем грамотно оисано действие функции CloseFile. Вообще сообщения такого рода нужно сравнивать с описаниями из других источников и не забывать, конечно, про встроенную справку.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter