NTFS-потоки и прочее

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

NTFS-потоки и прочее

Сообщение ANDLL » 25.11.2006 (Сб) 13:48

Что такое NTFS-поток.
Изображение
Каждый файл в файловой системе NTFS представляет собой набор из потоков, каждый из которых имеет некоторое имя. Среди прочих потоков можно выделить поток с именем "". Это безымянный поток. Именно в нем хранится "содержимое" файла, которое мы сможем увидеть, открыв файл скажем в блокноте или в hex-редакторе.
Помимо основного потока, файл может содержать и другие потоки. К ним можно обращаться как к обычным файлам, при этом имя, которое надо передать в файловую функцию что бы открыть поток состоит из двух частей: имя_файла:имя_потока.
Например,C:\windows\file1.txt:Stream1 это имя потока Stream1, "приписанного" к файлу C:\windows\file1.txt. Важно отметить, что NTFS-потоки копируются, вместе с самим файлом. Но, так же следует помнить, что если вы передаете файл на FTP-сервер, или копируете его на диск с файловой системой не NTFS, то все его файловые потоки, кроме безымянного, будут потеряны. Думаю, не стоит говорить, что файловые потоки могут быть только на дисках с ФС NTFS и работать с ними можно только в Windows NT based.

Работа с потоками в блокноте.

Создадим в пустой папке, скажем C:\f1 файл tst.txt.
Открыв двойным щелчком этот файл в блокноте, легко убедимся что он пустой. Зайдем в командную строку и наберем там
cd C:\f1
notepad tst.txt:Stream1
Блокнот скажем, что файла tst.txt:Stream1.txt нету и предложит создать его.
Скажем да. Блокнот создаст файл. Так как блокнот "на легке" рабоатет с файловыми функциями windows для него не будет разницы, является ли переданное имя именем самостоятельного файла или именем NTFS-потока.
Теперь мы можем набрать что-то и сохранить.
Обратите внимание, что наш файл остался пустым, и что его размер равен все еще 0 байт. Более того, проводник покажет, что и вся папка C:\f1 так же имеет нулевой размер. Объем, заянтый именованным NTFS-потоком нигде не зафиксировался(хотя, конечно же, он вычтется из квоты пользователя и из свободного места на диске).
Кроме того, новый NTFS-поток не будет видно большинству файловых мэнеджеров. Ну вы поняли, к чему это я ;)

Работа с файловыми потоками в VB 6

А тут все совсем просто. VB не проверяет пути, которые передаются в оператор Open, а потому с NTFS-потоками здесь можно работать как с простыми файлами.
Код: Выделить всё
Private Sub Form_Load()
Dim s As String
Open "C:\f1\tst.txt:Stream1" For Output As #1
    Print #1, "AAAAA"
Close #1
Open "C:\f1\tst.txt:Stream1" For Input As #1
    Line Input #1, s
Close #1
MsgBox s
End Sub


Работа с NTFS-потоками в VB 2005

Ну и на последок отметим, что код, работающий без сбоев в VB 6 не работает в VB 2005
Код: Выделить всё
Dim A as New io.FileStream("C:\f1\tst.txt:Stream1")
Данный код выдаст ошибку, мол такого пути к файлу не существует...
Вот такой вот мощный FW :)

Правда, можно попробовать юзать вот такой класс
Код: Выделить всё
Public Class NTFSStream
    Inherits IO.FileStream
    Dim A As Microsoft.Win32.SafeHandles.SafeFileHandle
    Private Const GENERIC_WRITE = &H40000000
    Private Const GENERIC_ALL = &H10000000
    Private Const GENERIC_READ = &H80000000
    Private Const OPEN_EXISTING = 3
    Private Const FILE_SHARE_READ = &H1
    Private Const FILE_SHARE_WRITE = &H2
    Private Declare Unicode Function CreateFile Lib "kernel32" Alias "CreateFileW" (ByVal lpFileName As String, ByVal dwDesiredAccess As Integer, ByVal dwShareMode As Integer, ByVal lpSecurityAttributes As Integer, ByVal dwCreationDisposition As Integer, ByVal dwFlagsAndAttributes As Integer, ByVal hTemplateFile As Integer) As Integer

    Public Sub New(ByVal nFile As String, ByVal nStream As String)
        MyBase.New(New Microsoft.Win32.SafeHandles.SafeFileHandle(CreateFile(nFile & ":" & nStream, GENERIC_ALL, 0, 0, 4, 0, 0), True), IO.FileAccess.ReadWrite)
    End Sub
End Class
Правда, класс только для примера, в реальности его надо доробатывать, причем очень сильно.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

--=GAMER=--
Фиолетовый бот
Фиолетовый бот
Аватара пользователя
 
Сообщения: 810
Зарегистрирован: 22.03.2004 (Пн) 11:29
Откуда: Владивосток

Сообщение --=GAMER=-- » 25.11.2006 (Сб) 17:26

Эта 5! :)
В темноте слепец — самый надежный проводник. В эпоху безумия пусть тебя ведет сумасшедший.

rRenderer Engine
VB Wiki

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 25.11.2006 (Сб) 18:19

Дык а зачем эти потоки вообще нужны изначально?
Понятно, что впринципе можно спрятать там инфу, раз половина файлменеджеров работать с ними не умеет.
Что они мне дают ещё?
Я знаю верный путь

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 25.11.2006 (Сб) 18:55

Вкладка "Сводка" в диалоге "Свойства" файла работает через них.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.11.2006 (Вс) 9:26

Q2W писал(а):Что они мне дают ещё?

Дают привязать к файлам разную метаинфу (например, антивирусам -- дату последней проверки и т.п.)
Дают реализовать файл-серверы для Маков (у них в каждом файле два потока).
Мало?
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 26.11.2006 (Вс) 16:42

tyomitch писал(а):
Q2W писал(а):Что они мне дают ещё?

Дают привязать к файлам разную метаинфу (например, антивирусам -- дату последней проверки и т.п.)
Дают реализовать файл-серверы для Маков (у них в каждом файле два потока).
Мало?


Я бы последний вопрос перефразировал так:
А надо?

)))

Надобнсть спорная, особенно если вспомнить HPFS с её расширенными аттрибутами(аналоги потоков). И как часто, они исчезали) Особенно, при переносе на FAT))).
Но если кого то устраивает, то ради бога, чёж не воспользоваться?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 26.11.2006 (Вс) 16:55

Себас, надо! Это пока что самый производительный способ хранения мета-данных (не беря реляционные FS).
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 26.11.2006 (Вс) 17:27

gaidar писал(а):Себас, надо! Это пока что самый производительный способ хранения мета-данных (не беря реляционные FS).


Со вторым не спорю) Но как говаривал наш всемипочитаемый Дэн:
Технология ценна только в контексте решения той проблемы, которую призвана решать.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 27.11.2006 (Пн) 19:37

Absolutely, поэтому делать то, что некоторые товарищи делают (например, храня потоках информацию о настройках компиляции файлов проекта - был у меня случай такой с одним больно умным C++ компилятором) категорически нельзя :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 76

    TopList