![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
---|Ветка была без названия|---
frost © (2003-11-02 20:12:00)
Как вытащить сводку файла(папки)? Сводка вкладка котороя добавлена в свойствах файла или папки при работе в файловой системе NTFS. Спасибо.
Бином Ньютоныч (2003-11-22 01:26:00) [1]
type
TInt64 = packed record
Low, High: DWORD;
end;
TWIN32StreamID = packed record
dwStreamId: DWORD;
dwStreamAttributes: DWORD;
Size: TLargeInteger;
dwStreamNameSize: DWORD;
cStreamName: array[0..0] of WCHAR;
end;
var
StreamID: TWIN32StreamID;
BytesRead, d1, d2: Cardinal;
H: THandle;
pContext: Pointer;
s: WideString;
begin
integer(H):=FileOpen("Test.txt", fmOpenRead);
if H = INVALID_HANDLE_VALUE then RaiseLastOSError;
try
ZeroMemory(@StreamID, SizeOf(StreamID));
pContext:=nil;
while
BackupRead(H, @StreamID, SizeOf(StreamID) - SizeOf(StreamID.cStreamName),
BytesRead, false, false, pContext)
do
begin
if StreamID.Size = 0 then Break;
SetLength(s, StreamID.dwStreamNameSize shr 1);
BackupRead(H, @s[1], StreamID.dwStreamNameSize, BytesRead,
false, false, pContext);
s:=Format("ID: %d; Name: %s",[StreamID.dwStreamId, s]);
Memo1.Lines.Add(s);
BackupSeek(H, TInt64(StreamID.Size).Low, TInt64(StreamID.Size).High,
d1, d2, @pContext);
end;
BackupRead(H, nil, 0, BytesRead, true, false, pContext);
finally
CloseHandle(H);
end;
A.M.D.F. (2003-11-21 21:57:00) [2]
Сводка хранится в скрытом файловом потоке. Сначала узнай имя потока, например запакуй файл в Winrar с включенной опцией "сохранять файловые потоки NTFS" без компрессии, и посмотри название потока открыв архив хекс-редактором (он где то в конце).
Потом можно открывать поток функцией CreateFile как обычный файл, но в первом параметере указывать "имя_файла:имя_потока" и с помощью ReadFile и WriteFile копировать данные. Как узнать имя потока прямо из проги я уже тут спрашивал, но ничего внятного мне не ответили, так что я не знаю.