gpt4 book ai didi

delphi - 在 Delphi 中实现变更日志(步骤 2)

转载 作者:行者123 更新时间:2023-12-03 14:54:29 29 4
gpt4 key购买 nike

继续my previous question ,我能够使用这个delphi unit使用此 EnumMFTEntries() function 实现疯狂快速驱动器扫描 ,但我在执行以下任务时遇到困难:

任务#1:查询更改日志以获取新修改的文​​件(更改、重命名、删除等...)

在阅读了 EnumMFTEntries() 函数以及 StCroixSkipper's USN Journal Explorer 后,我改编了这个损坏的例程。 (在 C# 中)。

由于某种原因,报告的文件名始终为#0

function EnumUsnEntries(ARootHandle : Cardinal; AMFTEnumBuff : Pointer; EnumCallBack : TMFTEnumCallback) : Boolean;
var
P : Pointer;
UsnEnum : Pointer;
BytesRet : Cardinal;

PUSN : PUSNRecord;
ReadUSN : TReadUSNJournalData;
PReadUSN : PReadUSNJournalData;
UsnJournalData : TUSNJournalData;
BUF_SIZE : Integer;
begin
Result := False;
if (ARootHandle = INVALID_HANDLE_VALUE) OR (AMFTEnumBuff = nil) then
Exit;

QueryUSNJournal(ARootHandle, UsnJournalData);
with ReadUSN do
begin
StartUsn := UsnJournalData.NextUsn;
ReasonMask := USN_REASON_DATA_OVERWRITE OR USN_REASON_DATA_EXTEND OR USN_REASON_NAMED_DATA_OVERWRITE OR USN_REASON_NAMED_DATA_TRUNCATION OR
USN_REASON_FILE_CREATE OR USN_REASON_FILE_DELETE OR USN_REASON_EA_CHANGE OR USN_REASON_SECURITY_CHANGE OR
USN_REASON_RENAME_OLD_NAME OR USN_REASON_RENAME_NEW_NAME OR USN_REASON_INDEXABLE_CHANGE OR USN_REASON_BASIC_INFO_CHANGE OR
USN_REASON_HARD_LINK_CHANGE OR USN_REASON_COMPRESSION_CHANGE OR USN_REASON_ENCRYPTION_CHANGE OR
USN_REASON_OBJECT_ID_CHANGE OR USN_REASON_REPARSE_POINT_CHANGE OR USN_REASON_STREAM_CHANGE OR USN_REASON_CLOSE;
ReturnOnlyOnClose := 0;
Timeout := 0;
BytesToWaitFor := 0;
UsnJournalID := UsnJournalData.UsnJournalID;
end; // with

BUF_SIZE := SizeOf(ReadUSN);
GetMem(P, BUF_SIZE);
try
ZeroMemory(P, BUF_SIZE);
while DeviceIoControl(ARootHandle, FSCTL_READ_USN_JOURNAL, Addr(ReadUSN){UsnEnum}, SizeOf(ReadUSN{TReadUSNJournalData}), P, BUF_SIZE, BytesRet, nil) do
begin
PUSN := PUSNRecord{PReadUSNJournalData}(Integer(P) + SizeOf(Int64));
while (BytesRet > 0{60}) do
begin
if Not EnumCallBack(PUSN, nil{Extra}) then
Exit;

if PUSN.RecordLength > 0 then
Dec(BytesRet, PUSN.RecordLength)
else
Break;
PUSN := PUSNRecord(Cardinal(PUSN) + PUSN.RecordLength);
end; // while
CopyMemory(UsnEnum{MFTEnum}, P, SizeOf(Int64));
end; // while

Result := True;
finally
FreeMem(P);
end; // try/finally
end;
<小时/>

任务#2:将扫描限制到某个文件夹?

如果我没记错的话,似乎可以通过在 EnumMFTEntries() 中定义 StartUsn部分做到这一点。功能,但不清楚如何做到这一点。

任务#3:获取文件名的完整路径?

例如,EnumMFTEntries() 始终仅返回名称及其父文件夹引用号,目前尚不清楚获取完整路径的最快方法是什么。

<小时/>

我希望我没有要求太多,这些任务确实密切相关,我真的希望社区能够在这里提供帮助,使Delphi开发人员能够轻松实现疯狂快速的文件夹扫描。尽管它很有用,但变更日志/MFT 是最有趣但被遗忘的技术之一。这必须改变!

最佳答案

关于任务#2:您可以通过首先发出 FSCTL_READ_FILE_USN_DATA 来获取最后更改的 usn 编号,然后发出 FSTCL_READ_USN_JOURNAL 并将 StartUsn 成员分配给该 usn 编号来获取有关更改的有效信息,从而将 usn 数据搜索限制到特定文件/目录(蒂姆斯坦普,原因)。然而,这种方式只能获得最后的变化。要获得所有更改,我认为只能通过特定文件引用号过滤读取的 usn 日志数据。更多信息请参见 MSDN 库。

关于delphi - 在 Delphi 中实现变更日志(步骤 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527047/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com