rendered paste bodyunit cdorganizer;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, IBDatabase, IBCustomDataSet, IBUpdateSQL, IBQuery,
ComCtrls, ExtCtrls, ToolWin, Menus, ImgList;
type
TForm1 = class(TForm)
dbase: TIBDatabase;
IBTransaction1: TIBTransaction;
volupdate: TIBUpdateSQL;
ListView1: TListView;
TrayIcon1: TTrayIcon;
MainMenu1: TMainMenu;
File1: TMenuItem;
Help1: TMenuItem;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
volume: TIBDataSet;
files: TIBDataSet;
directories: TIBDataSet;
volumeVOLUMEID: TIntegerField;
volumeVOLUMENAME: TIBStringField;
volumeLABELNAME: TIBStringField;
volumeDRIVETYPE: TIntegerField;
directoriesDIRECTORYNAME: TIBStringField;
directoriesVOLUMEID: TIntegerField;
directoriesDIRECTORYID: TIntegerField;
filesFILEID: TIntegerField;
filesFILENAME: TIBStringField;
filesDIRID: TIntegerField;
filesVOLUMEID: TIntegerField;
filesDIRECTORYNAME: TIBStringField;
ImageList1: TImageList;
dirupdate: TIBUpdateSQL;
fileupdate: TIBUpdateSQL;
procedure FormShow(Sender: TObject);
procedure volumeNewRecord(DataSet: TDataSet);
private
procedure onDeviceChange(var wMSG : TMessage); message WM_DeviceChange;
public
{ Public declarations }
end;
const
DBT_DEVICEARRIVAL = $8000;
DBT_DEVICEREMOVECOMPLETE = $8004;
DBTF_MEDIA = $0001;
DBT_DEVTYP_VOLUME = $0002;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
pDevBroadcast = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = record
dbch_size : DWORD;
dbch_devicetype : DWORD;
dbch_reserved : DWORD;
end;
pDevBroadcastVolume = ^DEV_BROADCAST_VOLUME;
DEV_BROADCAST_VOLUME = record
dbcv_size : DWORD;
dbcv_devicetype : DWORD;
dbcv_reserved : DWORD;
dbcv_unitmask : DWORD;
dbcv_flags : WORD;
end;
pStorageBusType = ^STORAGE_BUS_TYPE;
STORAGE_BUS_TYPE = (BusTypeUnkown, BusTypeScsi, BusTypeAtapi, BustypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb,BusTypeRAID, BusTypeMaxReserved);
MEDIA_TYPE = (
Unknown,
F5_1Pt2_512,
F3_1Pt44_512,
F3_2Pt88_512,
F3_20Pt8_512,
F3_720_512,
F5_360_512,
F5_320_512,
F5_320_1024,
F5_180_512,
F5_160_512,
RemovableMedia,
FixedMedia,
F3_120M_512,
F3_640_512,
F5_640_512,
F5_720_512,
F3_1Pt2_512,
F3_1Pt23_1024,
F5_1Pt23_1024,
F3_128Mb_512,
F3_230Mb_512,
F8_256_128,
F3_200Mb_512,
F3_240M_512,
F3_32M_512
);
TTapeInfo = record
STORAGE_MEDIA_TYPE : MEDIA_TYPE;
MediaCharacteristics : DWORD;
CurrentBlockSize : DWORD;
STORAGE_BUS_TYPE : STORAGE_BUS_TYPE;
MediumType : BYTE;
DensityCode : BYTE;
end;
TDiskInfo = record
Cylinders : Large_Integer;
STORAGE_MEDIA_TYPE : MEDIA_TYPE;
TracksPerCylinder : DWORD;
SectorsPerTrack : DWORD;
BytesPerSector : DWORD;
NumberMediasides : DWORD;
MediaCharacteristics : DWORD;
end;
TRemoveableDiskInfo = record
Cylinders : Large_Integer;
Storage_Media_Type : MEDIA_TYPE;
TracksPerCylinder : DWORD;
SectorsPerTrack : DWORD;
BytesPerSector : DWORD;
NumberMediaSides : DWORD;
MediaCharacteristics : DWORD;
end;
pDeviceMediaInfo = ^DEVICE_MEDIA_INFO;
DEVICE_MEDIA_INFO = record
DiskInfo : TDiskInfo;
RemoveableDiskInfo : TRemoveableDiskInfo;
TapeInfo : TTapeInfo;
end;
pGetMediaTypes = ^GET_MEDIA_TYPES;
GET_MEDIA_TYPES = record
DeviceType : DWORD;
MediaInfoCount : DWORD;
MediaInfo : DEVICE_MEDIA_INFO;
end;
TVolInfo = record
serialNumber : String;
volumeName : String;
end;
function getVolInfo(theDrive: String) : TVolInfo;
var
volumeInfo : TVolInfo;
volName, sysType : PChar;
MaxComLen, sysFlags, volSerNum : DWORD;
begin
if(getVolumeInformation(PChar(theDrive),volName,1024,@volSerNum,MaxComLen,sysFlags,sysType,1024)) then
begin
volumeInfo.serialNumber := IntToStr(volSerNum);
volumeInfo.volumeName := volName;
Result := volumeInfo;
end;
end;
function getDrive(pDrive: PDevBroadCastVolume):String;
var
i : Byte;
uMask:DWORD;
begin
if (pDrive^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA then
begin
uMask := pDrive^.dbcv_unitmask;
for i := 0 to 25 do
begin
if(uMask and 1) = 1 then
Result := Char(i+Ord('A')) + ':';
uMask := uMask shr 1;
end;
end;
end;
procedure getContents(theDrive:String; theQuery:String; theFiles:TStringList; theVolume:String);
var
searchRec:TSearchRec;
result:Integer;
begin
theDrive := IncludeTrailingPathDelimiter(theDrive);
result := findFirst(theDrive+theQuery,faAnyFile,searchRec);
while result = 0 do
begin
if searchRec.Attr and faDirectory = 0 then
begin
theFiles.Add(theDrive+searchRec.Name);
// add files
end
else if(searchRec.Attr and faDirectory) <> 0 then
begin
if(searchRec.Name <> '.') and (searchRec.Name <> '..') then
begin
// add directory
theFiles.Add(theDrive+searchRec.Name+'\');
getContents(theDrive+searchRec.Name,theQuery,theFiles,'The Volume');
end;
end;
result := findNext(searchRec);
end;
findClose(searchRec);
theFiles.SaveToFile('fileList.txt');
end;
procedure TForm1.FormShow(Sender: TObject);
begin
dbase.Open;
end;
procedure TForm1.onDeviceChange(var wMSG: TMessage);
var
theDrive, theLabel : String;
theList : TStringList;
volResult : TVolInfo;
newDrive : TListItem;
begin
theList := TStringList.Create;
case wMSG.WParam of
DBT_DEVICEARRIVAL:
if (PDevBroadcast(wMSG.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
begin
theDrive := getDrive(PDevBroadcastVolume(wMsg.LParam));
volResult := getVolInfo(theDrive+'\');
ShowMessage(Self.ClassName);
newDrive := listview1.Items.add();
newDrive.Caption := 'test';
end;
DBT_DEVICEREMOVECOMPLETE: showMessage('CD REMOVED');
end;
end;
procedure TForm1.volumeNewRecord(DataSet: TDataSet);
begin
showMessage('new record');
end;
end.