Каждый файл в файловой системе 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