Вход | Регистрация

Информационные технологии ::

Метки:

Жесткие связи (Hard links) - пишу специально для всех посетителей форума...

Ø [Волшебник, 31.05.04 - 22:10]
Я
   Demiurg
 
31.05.04 - 20:28
Жесткие связи (Hard links)

Суть жестких связей заключается в том, что для одного и того же файла можно создать несколько разных имен внутри одного тома. Причем каждое из этих имен указывает на один и тот же физический файл. Удаляя файл, к которому создано несколько жестких связей, Вы физически не удаляете его с диска – он продолжает существовать! И существовать он будет до тех пор, пока Вы не удалите последнюю жесткую связь. Как это осуществляется? При создании жесткой связи с файлом система находит этот файл в MFT и добавляет новый атрибут имени. Одновременно с этим атрибут счетчика жестких связей увеличивается на 1. При удалении файла (из Explorer или из командной строки) удаляется соответствующий атрибут имени, а счетчик жестких связей уменьшается на 1. Таким образом, файл существует на диске до тех пор, пока счетчик жестких связей больше 0.

В Windows 2000 нет встроенных средств создания жестких связей. Для реализации этой функциональности можно воспользоваться функцией CreateHardLink. Предлагаемая программа HLINKS позволяет создавать жесткие связи и имеет графический интерфейс. Эта программа создает жесткие связи не изменяя списка контроля доступа к файлу, однако при желании его легко модифицировать. В случае создания жесткой связи выводится сообщение об успехе. Если же жесткую связь создать невозможно (например, Вы выбрали раздел с FAT), то выводится сообщение об ошибке. Программа написана на Visual Basic 6.0:

Файл HLINK.BAS
*******************

Public Type SECURITY_ATTRIBUTES
   nLength As Long
   lpSecurityDescriptor As Long
   bInheritHandle As Long
End Type
Public Declare Function CreateHardLink Lib "kernel32" Alias "CreateHardLinkA" (pszFileName As String, pszExistingFileName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Boolean
Файл HLINK.FRM
*******************

VERSION 5.00
Begin VB.Form Form1
  Caption         =   "Hard Links"
  ClientHeight    =   3780
  ClientLeft      =   60
  ClientTop       =   345
  ClientWidth     =   7245
  LinkTopic       =   "Form1"
  ScaleHeight     =   3780
  ScaleWidth      =   7245
  StartUpPosition =   3  'Windows Default
  Begin VB.CommandButton Command2
     Cancel          =   -1  'True
     Caption         =   "E&xit"
     Height          =   375
     Left            =   5760
     TabIndex        =   10
     Top             =   120
     Width           =   1335
  End
  Begin VB.Frame Frame2
     Caption         =   "New Link"
     Height          =   3255
     Left            =   3720
     TabIndex        =   3
     Top             =   480
     Width           =   3255
     Begin VB.CommandButton Command1
        Caption         =   "&Create"
        Default         =   -1  'True
        Height          =   375
        Left            =   960
        TabIndex        =   9
        Top             =   2760
        Width           =   1575
     End
     Begin VB.TextBox txtName
        Height          =   285
        Left            =   120
        TabIndex        =   7
        Top             =   2280
        Width           =   3015
     End
     Begin VB.DirListBox Dir2
        Height          =   1665
        Left            =   120
        TabIndex        =   6
        Top             =   240
        Width           =   3015
     End
     Begin VB.Label Label2
        Caption         =   "Enter hard link name:"
        Height          =   255
        Left            =   120
        TabIndex        =   8
        Top             =   2040
        Width           =   2535
     End
  End
  Begin VB.Frame Frame1
     Caption         =   "Existing File"
     Height          =   3255
     Left            =   120
     TabIndex        =   2
     Top             =   480
     Width           =   3375
     Begin VB.FileListBox File1
        Height          =   1260
        Left            =   120
        TabIndex        =   5
        Top             =   1800
        Width           =   3135
     End
     Begin VB.DirListBox Dir1
        Height          =   1440
        Left            =   120
        TabIndex        =   4
        Top             =   240
        Width           =   3135
     End
  End
  Begin VB.DriveListBox Drive1
     Height          =   315
     Left            =   1440
     TabIndex        =   0
     Top             =   120
     Width           =   1935
  End
  Begin VB.Label Label1
     Caption         =   "Volume Name:"
     Height          =   255
     Left            =   120
     TabIndex        =   1
     Top             =   120
     Width           =   1215
  End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
   Dim V As SECURITY_ATTRIBUTES
   Dim sOriginFile As String
   Dim sLinkName As String
   If
   txtName.Text <>  "" Then
       If
       File1.ListIndex > = 0 Then
           sOriginFile = Dir1.Path & "\" & File1.FileName
           sLinkName = Dir2.Path & "\" & txtName.Text
           If CreateHardLink(ByVal sLinkName, ByVal sOriginFile, V) Then
               MsgBox "Created"
           Else
               MsgBox "Error"
           End If
       Else
           MsgBox "Select Original File"
       End If
   Else
       MsgBox "You need to enter HardLink Name"
   
   End If
End Sub

Private Sub Command2_Click()
   End
End Sub

Private Sub Dir1_Change()
   File1.Path = Dir1.Path
End Sub

Private Sub Drive1_Change()
   Dir1.Path = Drive1.Drive
   Dir2.Path = Drive1.Drive
End Sub

---
p.s. думаю, для тех, кто иногда думает, я дал пищу для размышлений :)))
 
 
   Demiurg
 
1 - 31.05.04 - 20:30
HLINKS.VBP
------------
Type=Exe
Form=hlinks.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#D:\WINNT\system32\stdole2.tlb#OLE Automation
Module=Module1; hlinks.bas
Startup="Form1"
ExeName32="hlinks.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft ZAO"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]
AutoRefresh=1
   Demiurg
 
2 - 31.05.04 - 20:32
программу можно скачать здесь

http://www.gilev.ru/hlinks.exe
   SnarkHunter
 
3 - 31.05.04 - 20:36
Я никогда не думаю - разжуй пищу...
   Demiurg
 
4 - 31.05.04 - 20:40
(3) см. пункт 2, специально же дал :) для таких господ
   Demiurg
 
5 - 31.05.04 - 21:03
(да, файл буду на своем ресурсе держать неделю, потом сотру, чай ресурс не резиновый, извиняйте)
   BorisG
 
6 - 31.05.04 - 21:09
Навое... хорошо забытое старое... (c) ;-))
Сии связи были еще в RSX-11M...
   Demiurg
 
7 - 31.05.04 - 21:21
(6) Так они в UNIX-е всегда существовали, если ты не знаешь!
А вот в винде я мало встречал толкового на эту тему, вот и написал, спасибо за конструктивную критику :)
   Demiurg
 
8 - 31.05.04 - 21:24
Специально для Бориса (остальным просьба не заморачиваться :) )
---
Многопоточные файлы (Multiple streams files)
Одним из свойств NTFS, существовавшим с самых первых версий Windows NT, является возможность использования многопоточных файлов (multiple streams files).  Когда Вы создаете новый файл (например текстовым редактором), информация по умолчанию заносится в неименованный поток файла. Однако у этого же самого файла могут быть и именованные потоки, которые записываются как:

Мой файл.txt: Мой первый поток
Мой файл.txt: Мой второй поток
Мой файл.txt: Мой третий поток

В каждый из этих потоков заносится своя информация. В Windows 2000 именованные потоки используются для хранения информации о файле такой, как Заголовок, предмет, ключевые слова и т.п. – словом всего того, что находится в диалоговом окне File Properties, вкладка Summary. Для альтернативного доступа к этой информации предлагается программа Streams.

С помощью этой программы можно просмотреть содержимое любого именованного потока. Для этого надо указать его имя. Кроме именованных потоков, относящихся к этой информации, был также обнаружен еще один неименованный. Особенностью этого потока является то, что это разреженный поток – его объявленная длина отличается от фактической.

VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
Begin VB.Form Form1
  Caption         =   "Streams"
  ClientHeight    =   3195
  ClientLeft      =   60
  ClientTop       =   345
  ClientWidth     =   4680
  LinkTopic       =   "Form1"
  ScaleHeight     =   3195
  ScaleWidth      =   4680
  StartUpPosition =   3  'Windows Default
  Begin VB.CheckBox Check1
     Caption         =   "System stream"
     Height          =   195
     Left            =   120
     TabIndex        =   8
     Top             =   900
     Width           =   2295
  End
  Begin VB.CommandButton cmdFile
     Caption         =   "..."
     Height          =   375
     Left            =   4200
     TabIndex        =   7
     Top             =   0
     Width           =   375
  End
  Begin MSComDlg.CommonDialog cmDlg1
     Left            =   3960
     Top             =   2760
     _ExtentX        =   847
     _ExtentY        =   847
     _Version        =   393216
     DialogTitle     =   "Open File"
     Filter          =   "*.*"
  End
  Begin VB.TextBox TxtName
     Height          =   375
     Left            =   1440
     TabIndex        =   4
     Top             =   0
     Width           =   2655
  End
  Begin VB.TextBox txtStream
     Height          =   375
     Left            =   1440
     TabIndex        =   3
     Top             =   480
     Width           =   3135
  End
  Begin VB.TextBox TxtContent
     Height          =   1455
     Left            =   120
     MousePointer    =   3  'I-Beam
     MultiLine       =   -1  'True
     ScrollBars      =   2  'Vertical
     TabIndex        =   2
     Top             =   1200
     Width           =   4455
  End
  Begin VB.CommandButton CmdWrite
     Caption         =   "Write"
     Height          =   375
     Left            =   2400
     TabIndex        =   1
     Top             =   2760
     Width           =   1095
  End
  Begin VB.CommandButton CmdRead
     Caption         =   "Read"
     Height          =   375
     Left            =   480
     TabIndex        =   0
     Top             =   2760
     Width           =   1095
  End
  Begin VB.Label Label2
     BackStyle       =   0  'Transparent
     Caption         =   "Stream:"
     Height          =   255
     Left            =   120
     TabIndex        =   6
     Top             =   480
     Width           =   735
  End
  Begin VB.Label Label1
     BackStyle       =   0  'Transparent
     Caption         =   "File Name:"
     Height          =   255
     Left            =   120
     TabIndex        =   5
     Top             =   120
     Width           =   975
  End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False


Private Sub cmdFile_Click()
cmDlg1.CancelError = True
On Error GoTo errhandler
cmDlg1.ShowOpen
TxtName.Text = cmDlg1.FileName
errhandler:
Exit Sub

End Sub

Private Sub CmdRead_Click()
TxtContent.Text = ""
FName = TxtName.Text
If Check1.Value = 1 Then
   S = Chr(5)
Else
   S = ""
End If
If txtStream.Text <> "" Then FName = FName & ":" & S & txtStream.Text
On Error GoTo errhandler
Open FName For Input As "1"
Do While Not EOF(1)
Input #1, vv
TxtContent.Text = TxtContent.Text & vv
Loop
Close (1)
Exit Sub
errhandler:
MsgBox "Error file access"
End Sub

Private Sub CmdWrite_Click()
FName = TxtName.Text & ":" & txtStream.Text
Open FName For Output As "1"
Write #1, TxtContent.Text
Close (1)
End Sub
   Demiurg
 
9 - 31.05.04 - 21:25
STREAMS.VBP
---
Type=Exe
Form=streams.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#D:\WINNT\system32\stdole2.tlb#OLE Automation
Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; COMDLG32.OCX
IconForm="Form1"
Startup="Form1"
HelpFile=""
Title="streams"
ExeName32="streams.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="Microsoft ZAO"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]
AutoRefresh=1
   Demiurg
 
10 - 31.05.04 - 21:26
http://www.gilev.ru/streams.exe

(тоже неделя)
 
  Рекламное место пустует
   427
 
11 - 31.05.04 - 21:50
Относительно редко используемое свойство - жестких линков...
Описано в документации...
использовано (если по теме форума) - года полтора назад был предложен способ иметь один справочник на несколько  конф... работает, но может пострадать ссылочная целостность...  Реально может использоваться ... не скажу... а то подушками закидают...

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

В НТ есть много механизмов, которые отсутствуют в обычных виндах... Чтобы не закладываться на эти ОС - разработчики прикладных систем практически не используют эти механизмы или используют их очень редко (например, намед пайпес).... etc и перечисленное выше (кроме компаунда)....
   Demiurg
 
12 - 31.05.04 - 21:54
(11) ты тоже ни чего не понял, жаль, все таки у вас с Борисом больше общего, чем я думал...
   427
 
13 - 31.05.04 - 22:08
Если ты решил, что все посетители форума дружно кинутся программировать с использованием этих возможностей - ты ошибаешься.... 999 человекам из 1000 - как то пофиг наличие той или иной возможности, пока его в задницу не начнет клевать жареный медведь...

В виндах много фишек... Знать о всех - неразумно, тем более об экзотических...

Лучше расскажи, как спрятать второй и последующие диски в проводнике при просмотре (кстати, С тоже можно убрать....).

Я думаю - это будет более актуально ....


Список тем форума
  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует