Accueil > > > MAPPING DE FICHIER ET TSTREAM
MAPPING DE FICHIER ET TSTREAM
Information sur la source
Description
Cette unit contien un simple objet TSream surchargé pour employé le principe du mapping de fichier en mémoire de Windows. Il s'utilise comme un MemoryStream ou un FileSream
Source
- unit MappedFileStream;
-
- interface
-
- uses
- Windows,
- SysUtils,
- Classes;
-
- type
- TMappedFileStream = class(TStream)
- private
- hMapping : THandle; // Handle de l'objet file-mapping
- FMemory : pByteArray;// Adresse de base du mapping
- FHandle : THandle; // Handle du fichier ouvert pour le mapping
- FPosition,
- FSize : Integer;
- public
- // Enregistre les pages modifiées dans le fichier sur le disque
- procedure Flush;
- function Read(var Buffer; Count: Longint): Longint; override;
- function Write(const Buffer; Count: Longint): Longint; override;
- function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
- property Memory: pByteArray read FMemory;
- property Position: Integer read FPosition;
- property Size : Integer read FSize;
- property Handle: THandle read FHandle;
- constructor Create(FileName: string;
- Mode: Word = fmOpenRead;
- Rights: Cardinal = fmShareExclusive;
- Offset: Cardinal = 0;
- MaxSize: Cardinal = 0);
- destructor Destroy; override;
- published
- { Published declarations }
- end;
-
- implementation
-
- procedure TMappedFileStream.Flush;
- begin
- FlushViewOfFile(FMemory, 0);
- end;
-
- function TMappedFileStream.Read(var Buffer; Count: Integer): Integer;
- begin
- if FPosition + Count > Size then Count := Size - FPosition;
- move(FMemory[FPosition], Buffer, Count);
- Result := Count;
- end;
-
- function TMappedFileStream.Write(const Buffer; Count: Longint): Longint;
- begin
- if FPosition + Count > Size then Count := Size - FPosition;
- move(Buffer, FMemory[FPosition], Count);
- Result := Count;
- end;
-
- function TMappedFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
- begin
- Case Origin of
- soBeginning: // Seek from the beginning of the resource. The seek operation moves to a specified position (offset), which must be greater than or equal to zero.
- if Offset < FSize then FPosition := Offset else raise ERangeError.Create('');
- soCurrent : // Seek from the current position in the resource. The seek operation moves to an offset from the current position (position + offset). The offset is positive to move forward, negative to move backward.
- if FPosition + Offset < FSize then FPosition := FPosition + Offset else raise ERangeError.Create('');
- soEnd : // Seek from the end of the resource. The seek operation moves to an offset from the end of the resource, where the offset is expressed as a negative value because it is moving toward the beginning of the resource.
- if FSize - Offset >= 0 then FPosition := FSize - Offset else raise ERangeError.Create('');
- end;
-
- result := FPosition;
- end;
-
- constructor TMappedFileStream.Create(FileName: string;
- Mode: Word = fmOpenRead;
- Rights: Cardinal = fmShareExclusive;
- Offset: Cardinal = 0;
- MaxSize: Cardinal = 0);
- var
- dwDA, dwSM, dwCD, flP, dwVA: DWORD;
- FileInfo: _BY_HANDLE_FILE_INFORMATION;
- begin
- // Initialise correctement les attributs de construction du mapping
- case Mode of
- fmCreate:
- begin
- dwCD := CREATE_ALWAYS;
- dwDA := GENERIC_WRITE and GENERIC_READ;
- dwVA := FILE_MAP_WRITE;
- flP := PAGE_READWRITE;
- end;
- fmOpenRead:
- begin
- dwCD := OPEN_EXISTING;
- dwDA := GENERIC_READ;
- dwVA := FILE_MAP_READ;
- flP := PAGE_READONLY;
- end;
- fmOpenWrite:
- begin
- dwCD := TRUNCATE_EXISTING;
- dwDA := GENERIC_WRITE and GENERIC_READ;
- dwVA := FILE_MAP_WRITE;
- flP := PAGE_READWRITE;
- end;
- fmOpenReadWrite:
- begin
- dwCD := OPEN_EXISTING;
- dwDA := GENERIC_WRITE and GENERIC_READ;
- dwVA := FILE_MAP_WRITE;
- flP := PAGE_READWRITE;
- end;
- end;
-
- case Rights of
- fmShareCompat or fmShareExclusive:
- begin
- dwSM := 0;
- end;
- fmShareDenyWrite:
- begin
- dwSM := FILE_SHARE_READ;
- end;
- fmShareDenyRead:
- begin
- dwSM := FILE_SHARE_WRITE;
- end;
- fmShareDenyNone:
- begin
- dwSM := FILE_SHARE_READ and FILE_SHARE_WRITE;
- end;
- end;
-
- // Ouvre le fichier
- FileName := FileName + #0; // Ajout du zero terminal
- FHandle := CreateFile(@FileName[1], dwDA, dwSM, nil, dwCD, 0, 0);
- inherited create;
- if FHandle = INVALID_HANDLE_VALUE then raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
-
- if MaxSize = 0 then begin
- if not GetFileInformationByHandle(FHandle, FileInfo) then begin
- CloseHandle(FHandle);
- raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
- end;
- FSize := FileInfo.nFileSizeLow;
- end else FSize := MaxSize;
-
- hMapping := CreateFileMapping(FHandle, nil, flP, 0, FSize, nil);
- if hMapping = INVALID_HANDLE_VALUE then begin
- FileClose(FHandle);
- raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
- end;
-
- FMemory := MapViewOfFile(hMapping, dwVA, 0, 0, FSize);
- if FMemory = nil then begin
- FileClose(FHandle);
- CloseHandle(hMapping);
- raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
- end;
-
- end;
-
- destructor TMappedFileStream.Destroy;
- begin
- Flush;
- UnMapViewOfFile(FMemory);
- CloseHandle(hMapping);
- CloseHandle(FHandle);
- inherited destroy;
- end;
-
- end.
unit MappedFileStream;
interface
uses
Windows,
SysUtils,
Classes;
type
TMappedFileStream = class(TStream)
private
hMapping : THandle; // Handle de l'objet file-mapping
FMemory : pByteArray;// Adresse de base du mapping
FHandle : THandle; // Handle du fichier ouvert pour le mapping
FPosition,
FSize : Integer;
public
// Enregistre les pages modifiées dans le fichier sur le disque
procedure Flush;
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; override;
property Memory: pByteArray read FMemory;
property Position: Integer read FPosition;
property Size : Integer read FSize;
property Handle: THandle read FHandle;
constructor Create(FileName: string;
Mode: Word = fmOpenRead;
Rights: Cardinal = fmShareExclusive;
Offset: Cardinal = 0;
MaxSize: Cardinal = 0);
destructor Destroy; override;
published
{ Published declarations }
end;
implementation
procedure TMappedFileStream.Flush;
begin
FlushViewOfFile(FMemory, 0);
end;
function TMappedFileStream.Read(var Buffer; Count: Integer): Integer;
begin
if FPosition + Count > Size then Count := Size - FPosition;
move(FMemory[FPosition], Buffer, Count);
Result := Count;
end;
function TMappedFileStream.Write(const Buffer; Count: Longint): Longint;
begin
if FPosition + Count > Size then Count := Size - FPosition;
move(Buffer, FMemory[FPosition], Count);
Result := Count;
end;
function TMappedFileStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
Case Origin of
soBeginning: // Seek from the beginning of the resource. The seek operation moves to a specified position (offset), which must be greater than or equal to zero.
if Offset < FSize then FPosition := Offset else raise ERangeError.Create('');
soCurrent : // Seek from the current position in the resource. The seek operation moves to an offset from the current position (position + offset). The offset is positive to move forward, negative to move backward.
if FPosition + Offset < FSize then FPosition := FPosition + Offset else raise ERangeError.Create('');
soEnd : // Seek from the end of the resource. The seek operation moves to an offset from the end of the resource, where the offset is expressed as a negative value because it is moving toward the beginning of the resource.
if FSize - Offset >= 0 then FPosition := FSize - Offset else raise ERangeError.Create('');
end;
result := FPosition;
end;
constructor TMappedFileStream.Create(FileName: string;
Mode: Word = fmOpenRead;
Rights: Cardinal = fmShareExclusive;
Offset: Cardinal = 0;
MaxSize: Cardinal = 0);
var
dwDA, dwSM, dwCD, flP, dwVA: DWORD;
FileInfo: _BY_HANDLE_FILE_INFORMATION;
begin
// Initialise correctement les attributs de construction du mapping
case Mode of
fmCreate:
begin
dwCD := CREATE_ALWAYS;
dwDA := GENERIC_WRITE and GENERIC_READ;
dwVA := FILE_MAP_WRITE;
flP := PAGE_READWRITE;
end;
fmOpenRead:
begin
dwCD := OPEN_EXISTING;
dwDA := GENERIC_READ;
dwVA := FILE_MAP_READ;
flP := PAGE_READONLY;
end;
fmOpenWrite:
begin
dwCD := TRUNCATE_EXISTING;
dwDA := GENERIC_WRITE and GENERIC_READ;
dwVA := FILE_MAP_WRITE;
flP := PAGE_READWRITE;
end;
fmOpenReadWrite:
begin
dwCD := OPEN_EXISTING;
dwDA := GENERIC_WRITE and GENERIC_READ;
dwVA := FILE_MAP_WRITE;
flP := PAGE_READWRITE;
end;
end;
case Rights of
fmShareCompat or fmShareExclusive:
begin
dwSM := 0;
end;
fmShareDenyWrite:
begin
dwSM := FILE_SHARE_READ;
end;
fmShareDenyRead:
begin
dwSM := FILE_SHARE_WRITE;
end;
fmShareDenyNone:
begin
dwSM := FILE_SHARE_READ and FILE_SHARE_WRITE;
end;
end;
// Ouvre le fichier
FileName := FileName + #0; // Ajout du zero terminal
FHandle := CreateFile(@FileName[1], dwDA, dwSM, nil, dwCD, 0, 0);
inherited create;
if FHandle = INVALID_HANDLE_VALUE then raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
if MaxSize = 0 then begin
if not GetFileInformationByHandle(FHandle, FileInfo) then begin
CloseHandle(FHandle);
raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
end;
FSize := FileInfo.nFileSizeLow;
end else FSize := MaxSize;
hMapping := CreateFileMapping(FHandle, nil, flP, 0, FSize, nil);
if hMapping = INVALID_HANDLE_VALUE then begin
FileClose(FHandle);
raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
end;
FMemory := MapViewOfFile(hMapping, dwVA, 0, 0, FSize);
if FMemory = nil then begin
FileClose(FHandle);
CloseHandle(hMapping);
raise Exception.Create('Erreur Windows N°' + IntToStr(GetLastError));
end;
end;
destructor TMappedFileStream.Destroy;
begin
Flush;
UnMapViewOfFile(FMemory);
CloseHandle(hMapping);
CloseHandle(FHandle);
inherited destroy;
end;
end.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
TNMStrm [ par neodelphi ]
Bonjour a tous 8)Voila, j'ai crée d'un coté un TNMStrm, et de l'autre coté un TNMStrmServ. Du coté 1 je cré un filestream, et pi je fait :NMStrm1.Post
TNMStrm [ par neodelphi ]
bonjour a tous !!!Voila, j'ai crée d'un coté un TNMStrm, et de l'autre coté un TNMStrmServ. Du coté 1 je cré un filestream, et pi je fait :NMStrm1.Pos
Transfert images par Stream [ par mattsprings ]
Bonjour, je cherche comment transferer des images dans un memorystream à travers le réseau. Je veux envoyer des images venant d'un composant TImage, à
Acces rapide à un fichier [ par bgK ]
Mon problème est le suivant :Je souhaite rechercher toutes les occurances d'une séquence de 4 octets dans un fichier.Voiçi le code que j'ai actuelleme
FileStream et libération de mémoire... [ par GenEars ]
GenEars > Bonjour,il y a quelques temps j'ai réutilisé une unité uFileByChunk qui m
memorystreams [ par Farfadet07 ]
Bonjour,Dans la gestion mémoire de mon programme, je souhaiterais stocker dans un stream toutes les données non nécessaires à un moment donné (notamme
free delphi O/R mapping framework [ par terafun ]
SalutJe cherchai une framework gratuite pour Object/Relation mapping et je ne trouvai aucune gratuiteSi vous connaissez une, merci de me le dire:)
Créer un Active X [ par leroukin ]
Bonjour,voici mon problème :Je suis actuellement en train de créer un active X. Tout se passe bien j'arrive à créer mes propriétés et mes procédures,
Placer des données d'un TFileStream dans un TMemoryStream [ par christophedlr ]
Bonsoir, Je voudrais dans mon programme, lire un fichier don les données que le lis sont transféré vers un TMemoryStream afin de pouvoir les placer e
Passer des objets à une DLL [ par christophedlr ]
Bonsoir, A la suite du problème que j'avais ici : http://www.delphifr.com/infomsg_PLACER-DONNEES-TFILESTREAM-DANS-TMEMORYSTREAM_1178462.aspx J'ai un
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|