怎么样取得磁盘中打开的所有文件

popmailzjw 2004-09-11 10:29:35
Delphi 下深入windows核心编程 一书中有这么一个例子,可是在我的电脑上就是搞不出来,我怎么看也没有看明白,不过我的水平太低了,现在我只想找这么一个东西,不知道哪位高人有呀

贴上《Delphi 下深入windows核心编程》中的源码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl, Buttons, ExtCtrls;

const
// Access modes
OPEN_ACCESS_READONLY = $0000;
OPEN_ACCESS_WRITEONLY = $0001;
OPEN_ACCESS_READWRITE = $0002;
OPEN_ACCESS_RO_NOMODLASTACCESS = $0004;
// Share modes
OPEN_SHARE_COMPATIBLE = $0000;
OPEN_SHARE_DENYREADWRITE = $0010;
OPEN_SHARE_DENYWRITE = $0020;
OPEN_SHARE_DENYREAD = $0030;
OPEN_SHARE_DENYNONE = $0040;
// Open flags
OPEN_FLAGS_NOINHERIT = $0080;
OPEN_FLAGS_NO_BUFFERING = $0100;
OPEN_FLAGS_NO_COMPRESS = $0200;
OPEN_FLAGS_ALIAS_HINT = $0400;
OPEN_FLAGS_NOCRITERR = $2000;
OPEN_FLAGS_COMMIT = $4000;
// File types
FILENORMAL = $0000;
MEMORYMAPPED = $0001;
DLLOREXECUTABLE = $0002;
SWAPFILE = $0004;
type
P32Regs = ^T32Regs; //32位寄存器结构
T32Regs = record
EBX: Longint;
EDX: Longint;
ECX: Longint;
EAX: Longint;
EDI: Longint;
ESI: Longint;
Flags: Longint;
end;
TOpenFileinfo = record //已打开文件的结构
openflag: integer;
filetype: integer;
filename: array[0..256] of char;
end;
POpenFileinfo = ^TOpenFileinfo;
TForm1 = class(TForm)
ListBox1: TListBox;
Panel1: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
ComboBox1: TComboBox;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FHandle: Thandle;
public
function EnumOpenFile(volume: byte; index: integer; var
Fileinfo: TOpenFileinfo; Enumtype: integer = 0): boolean;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
VWIN32_DIOC_DOS_IOCTL = 1; {MS-DOS Int21h 44xxh functions call}


function Tform1.EnumOpenFile(volume: byte; index: integer; var Fileinfo:
TOpenFileinfo; Enumtype: integer = 0): boolean;
//枚举磁盘正在使用的文件
var
R: T32Regs;
cb: DWord;
begin
fillchar(r, sizeof(r), 0);
R.EAX := $440D;
R.EBX := Volume;
R.ECX := $086D;
R.EDX := integer(@fileinfo.filename);
R.ESI := index;
R.EDI := Enumtype;
//列举全部正在运行的文件
DeviceiOControl(FHandle, VWIN32_DIOC_DOS_IOCTL, @R, SizeOf(R), @R,
SizeOf(R), cb, nil);
fileinfo.openflag := r.EAX;
fileinfo.filetype := r.ECX;
Result := (R.Flags and 1) = 0;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
DriveNum: byte;
DriveChar: Char;
DriveType: TDriveType;
DriveBits: set of 0..25;
FileInfo: TOpenFileinfo;
k: integer;
FileType, FileOpenFlags: string;
begin
Listbox1.items.clear;
try
Integer(DriveBits) := GetLogicalDrives; //获取逻辑盘
for DriveNum := 0 to 25 do //检索所有的盘
begin
if not (DriveNum in DriveBits) then Continue;
DriveChar := Char(DriveNum + Ord('A'));
if (Combobox1.items[Combobox1.itemindex] <> '全部') and
(Combobox1.items[Combobox1.itemindex][1] <> DriveChar) then
continue;
DriveType := TDriveType(GetDriveType(PChar(DriveChar + ':\')));
case DriveType of
dtFixed: //如果是硬盘
begin
k := 0;
while EnumOpenFile(DriveNum + 1, k, Fileinfo, 0) do //循环列举所有已打开的文件
begin
case LoWord(FileInfo.filetype) of
FILENORMAL: FileType := '普通';
MEMORYMAPPED: FileType := '内存映象';
DLLOREXECUTABLE: FileType := '可执行模块';
SWAPFILE: FileType := '交换文件';
else FileType := '未知';
end;

FileOpenFlags := '';
if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_RO_NOMODLASTACCESS) <> 0 then
FileOpenFlags := FileOpenFlags + '未知,'
else if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_READWRITE) <> 0 then
FileOpenFlags := FileOpenFlags + '读写,'
else if (LOWORD(FileInfo.openflag) and OPEN_ACCESS_WRITEONLY) <> 0 then
FileOpenFlags := FileOpenFlags + '只写,'
else FileOpenFlags := FileOpenFlags + '只读,';

if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYNONE) <> 0 then
FileOpenFlags := FileOpenFlags + '不屏蔽,'
else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYWRITE) <> 0 then
FileOpenFlags := FileOpenFlags + '屏蔽写,'
else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYREAD) <> 0 then
FileOpenFlags := FileOpenFlags + '屏蔽读,'
else if (LOWORD(FileInfo.openflag) and OPEN_SHARE_DENYREADWRITE) <> 0 then
FileOpenFlags := FileOpenFlags + '屏蔽读写,'
else FileOpenFlags := FileOpenFlags + '兼容,';

if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_COMMIT) <> 0 then
FileOpenFlags := FileOpenFlags + '提交'
else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NOCRITERR) <> 0 then
FileOpenFlags := FileOpenFlags + '非临界'
else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_ALIAS_HINT) <> 0 then
FileOpenFlags := FileOpenFlags + '别名'
else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NO_COMPRESS) <> 0 then
FileOpenFlags := FileOpenFlags + '不压缩'
else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NO_BUFFERING) <> 0 then
FileOpenFlags := FileOpenFlags + '没有缓冲区'
else if (LOWORD(FileInfo.openflag) and OPEN_FLAGS_NOINHERIT) <> 0 then
FileOpenFlags := FileOpenFlags + '不继承'
else FileOpenFlags := FileOpenFlags + '-';

Listbox1.items.Add(format('%-10s %-28s%s', [FileType, FileOpenFlags, fileinfo.filename]));
k := k + 1;
end;
end;
end;
end;
except
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
DriveNum: Integer;
DriveChar: Char;
DriveType: TDriveType;
DriveBits: set of 0..25;
begin
SendMessage(ListBox1.Handle, LB_SetHorizontalExtent, 700, longint(0));
combobox1.clear;
Integer(DriveBits) := GetLogicalDrives;
for DriveNum := 0 to 25 do
begin
if not (DriveNum in DriveBits) then Continue;
DriveChar := Char(DriveNum + Ord('A')); //从a---z
DriveType := TDriveType(GetDriveType(PChar(DriveChar + ':\')));
case DriveType of
dtFixed: combobox1.Items.Add(DriveChar + ':');
end;
end;
combobox1.Items.Add('全部');
Combobox1.itemindex := Combobox1.Items.count - 1;

FHandle := CreateFile('VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FHandle = INVALID_HANDLE_VALUE then halt;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if FHandle <> 0 then
CloseHandle(Fhandle);
end;

end.
...全文
149 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
'I:\zzzzzz\OpenAllFiles\VWIN32.txt',你用自己的路径,我试了,能运行
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
VWIN32.txt要先建立起来
FHandle := CreateFile('I:\zzzzzz\OpenAllFiles\VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
================================
什么叫打开的所有文件 ? 晕晕。
求教
===================================
那不改成“所有打开的文件”
YOHOYOHO 2004-09-11
  • 打赏
  • 举报
回复
什么叫打开的所有文件 ? 晕晕。
求教
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
第5章 磁盘读写
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
哪一章啊?有时间,我试式
抱朴守拙 2004-09-11
  • 打赏
  • 举报
回复
还没研究过,帮你顶。
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
我也觉得有问题,可能是系统不同
打开文件应该可以知道是否打开,不用DeviceiOControl
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
不会吧,这也行
问题是程序根本就没有找到打开的文件呀
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
FileOpenFlags := FileOpenFlags + '不继承'
else FileOpenFlags := FileOpenFlags + '-';

Listbox1.items.Add(format('%-10s %-28s%s', [FileType, FileOpenFlags, fileinfo.filename]));
k := k + 1;
//加个次数限制
if k>100 then Exit;
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
不行,还是死循环
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
===============
2000以上是这样的:
\\.\C:
==============
这样呀,我说为什么不能通呢,这样改了能行吗
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
2000以上是这样的:
\\.\C:
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
好像只用用于win9x,你有vwin32.vxd 文件么?
pandengzhe 2004-09-11
  • 打赏
  • 举报
回复
得到的内容不对,我以为书中有解释,再研究一下
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
TO:pandengzhe(无为之为 之 混迹苍生) :不会是死循环吗
popmailzjw 2004-09-11
  • 打赏
  • 举报
回复
FHandle := CreateFile('VWIN32.txt', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
这一句我搞错了,应该是

FHandle := CreateFile('\\.\VWIN32', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

VWIN32是一个系统上的东西,不能是自己的东西,不好意思,我改了以后没有改过来
jiang5460 2004-09-11
  • 打赏
  • 举报
回复
能力有限,帮你顶了,给点小分了,谢谢
博旺软件 2004-09-11
  • 打赏
  • 举报
回复
这个是什么意思,有什么
用处..

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧