Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Файловая технология


Автор: SoWa 26.2.2006, 19:41
Суть проблеммы в том, что существует некая технология в файловых системах NTFS, позволяющая дописывать в файл информацию, при этом его размер не меняется. Похоже называется файловыми потоками(FileStream- вроде не то).
Если кто знает- что это за технология и как с ней работать посредствам Дельфи.

Автор: SoWa 26.2.2006, 20:14
А может быть как то используется свободное место жесткого диска, а в файл только указатель дописывается?

Автор: Girder 26.2.2006, 23:48
Файл занимает больше... чем видеш в инфе об файле... из-за выравнивания "на сектор/кластер". Вот в енто не использованное место можеш писать(если конечно... размер ентого места будет тебе достаточен smile ).

Если мне неизменяет память... p0s0l выкладывал пример через Mapping пример ентого. Также можеш взять в арсенале его пример dfa.zip и его использывать.

Автор: mes 27.2.2006, 00:13
Цитата(Girder @ 26.2.2006, 23:48 Найти цитируемый пост)
Файл занимает больше... чем видеш в инфе об файле... из-за выравнивания "на сектор/кластер".

Это относится к FAT, но не к NTFS.

В системе NTFS понятие файла отличается. Файл состоит из:
1) Запись в МФТ(католог записей)
2) Базовый поток
3) Прицепленые потоки.
Размером файла является тол'ко размер базового потока. А в прицепленые потоки можно приписать скольугодно большой объем информации и это не отразится на размере файла!
Но при копировании такого файла в другую файловую систему Виндоуз сообщит, что прицепленые данные будут утеряны.

Есть еще одна особеность у NTFS. Файлы малой длины не занимают пространство в области данных, а располагаются в МФТ-зоне.
Добавлено @ 00:15
Цитата(SoWa @ 26.2.2006, 20:14 Найти цитируемый пост)
А может быть как то используется свободное место жесткого диска, а в файл только указатель дописывается?


да. только не к самому файлу, а к записи индефицирующий етот файл.

Автор: mes 27.2.2006, 00:33
Вот нашел немного инфы:
http://www.ixbt.com/storage/ntfs.html

Автор: Girder 27.2.2006, 01:19
Цитата(mes @ 27.2.2006, 00:13 Найти цитируемый пост)
Это относится к FAT, но не к NTFS.
1. А при чем здесь "многопоточные файлы" и структура диска?
2. Любой поток... храниться на диске, а не в воздухе.
3. Именно к основному потоку... и приводились примеры записи. Вот только с сжатыми файлами не проверял... будут ли приведенные коды работать или нет.

PS: И не "каталог записей", а "главная файловая таблица"

Мдя'мс вот только вопрос я в начале не правильно прочитал... енто же про "многопоточные файлы"...
Добавлено @ 01:24
Цитата(mes @ 27.2.2006, 00:33 Найти цитируемый пост)
Вот нашел немного инфы:
smile

PS: http://www.ntfs.com/
Добавлено @ 01:26
http://www.ntfs.com/ntfs-multiple.htm

Автор: mes 27.2.2006, 01:43
Цитата(Girder @ 27.2.2006, 01:19 Найти цитируемый пост)
А при чем здесь "многопоточные файлы" и структура диска?

NTFS просто поддерживает многопоточные файлы, а FAT нет.

Цитата(Girder @ 27.2.2006, 01:19 Найти цитируемый пост)
2. Любой поток... храниться на диске, а не в воздухе.

Да свободное пространство диска уменьшается, но "видимый нами" размер файла остаётся прежним. ;)
Цитата(Girder @ 27.2.2006, 01:19 Найти цитируемый пост)
PS: И не "каталог записей", а "главная файловая таблица"

хотел выразится по понятней, но не получилось smile

Автор: Girder 27.2.2006, 02:24
Цитата(mes @ 27.2.2006, 01:43 Найти цитируемый пост)
NTFS просто поддерживает многопоточные файлы, а FAT нет
Ну ентом понятно. Я говорю об другом... а именно о записи в не доиспользованное место сектора(которое также возможно и в NTFS).

PS: Я ж говорю... не правильно прочитал вопрос в начале.

Ладно... уговорили. Даже Delphi запустил... для на всяк пожарной проверки smile

SoWa, все енто до безобразия очень просто:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
 //сохраняем то что в Memo в "многопоточный файл"
 Memo1.Lines.SaveToFile('k:\memo.txt');
 Memo2.Lines.SaveToFile('k:\memo.txt:memo2'); //опциональный поток
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 //читаем в обратном порядке из "многопоточного файла"
 Memo1.Lines.LoadFromFile('k:\memo.txt:memo2'); //опциональный поток
 Memo2.Lines.LoadFromFile('k:\memo.txt');
end;


PS: Но лудше... имхо все таки скрывать не в "опциональных потоках"... а так как говорил выше.

Автор: mes 27.2.2006, 04:49
Цитата(Girder @ 27.2.2006, 02:24 Найти цитируемый пост)
а именно о записи в не доиспользованное место сектора(которое также возможно и в NTFS).


Неа не лучше.
Во первых можно повредить файл(неизвестно как поведет себя если файл сжат).
во вторых приписать можно только ограниченый обьем.
При копировании етого файла в другое место информация будет потеряна.

Автор: Girder 27.2.2006, 11:29
Цитата(mes @ 27.2.2006, 04:49 Найти цитируемый пост)
неизвестно как поведет себя если файл сжат
Вот с ентим ХЗ... Там идет варавнивание на 16 кластеров... часть из них виртуальные... короче... лудше проверять атрибут smile и не пытаться записывать в сжатый файл(по первому варианту).

Автор: mes 2.3.2006, 14:05

Цитата(SoWa @ 26.2.2006, 19:41 Найти цитируемый пост)
существует некая технология в файловых системах NTFS


Спасибо Sowa, что привлек внимание к этой теме. Я подумал а не скрывает ли что от меня Windows.
Поэтому сравнил объем занятого пространства дисков с общим размером рассположеных на нём файлов.
На системных была значительная разница. (3Гб на одном и почти 2Гб на другом).
Я решил поексперентировать и перенес все файлы (включая системные) на другой диск.
Совершено пустой диск занимал почти 2Гб. Мне ето не понравилось и я отфармотировал етот диск.
После вернул файлы на место и перезагрузился с только что отфармотированного диска.
К моему удивлению система загрузилась и намного быстрей. Более того увеличилась скорость доступа к диску.
Результат 5гб " дополнительного " пространства. И нормальная дефрагментации диска.

Автор: SoWa 2.3.2006, 15:15
Так достаточно просто дефрагментацию сделать.

Автор: mes 3.3.2006, 03:17
Цитата(SoWa @ 2.3.2006, 15:15 Найти цитируемый пост)
Так достаточно просто дефрагментацию сделать.

Суть не в дефрагментации, а в освобожденном пространстве(5Гб! на двух дисках обшим объемом 40Гб), которое было "поглощено" только на системных! дисках. И в увелечение скорости доступа.

P.S. Плюс дефрагментации была произведена за день до експеримента. smile
P.S.S. А ты знал что родная Виндоузкая дефрагментация, делает свою работу не очень хорошо : оставляет очень много фрагментированных файлов? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)