Tfilestream : seek sur un très gros fichier [Résolu]

simoryl 5 Messages postés jeudi 20 mars 2003Date d'inscription 21 août 2007 Dernière intervention - 20 août 2007 à 17:23 - Dernière réponse : simoryl 5 Messages postés jeudi 20 mars 2003Date d'inscription 21 août 2007 Dernière intervention
- 21 août 2007 à 12:27
Salut,

Voilà, je cherche à faire un seek sur un gros fichier depuis la fin
dans le but de récupérer les 5 derniers Mo d'un fichier de 6Go.

Quand je fais un seek avec soFromEnd, il me met en position 0 et donc me recopie le fichier...

J'ai essayé de faire des seek successif depuis le début du fichier
pour arriver à la position souhaitée mais j'arrive au mieux à une
position de -294967296 octets et donc loin de mes 5Mo.

Est-ce que quelqu'un connait une solution à mon problème?

Merci

Simo'
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
simoryl 5 Messages postés jeudi 20 mars 2003Date d'inscription 21 août 2007 Dernière intervention - 21 août 2007 à 12:27
3
Merci
En effet, en lisant un octet tous les 100000, j'arrive à parcourir mon fichier du début vers la fin (mais pas l'inverse). Bon benh ça marche du coup :-)

Merci pour cette pertinente remarque :-)

Simo'

Merci simoryl 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 73 internautes ce mois-ci

Commenter la réponse de simoryl
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 20 août 2007 à 20:12
0
Merci
as tu essayé en faisant :

Stream.Position := Stream.Size - 5000000;
Commenter la réponse de f0xi
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 20 août 2007 à 20:20
0
Merci
Si tu connais précisément la position dans le flux, pourquoi ne pas itérer en précisant soFromCurrent depuis la première recherche avec soFromEnd ?

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Commenter la réponse de cs_Delphiprog
simoryl 5 Messages postés jeudi 20 mars 2003Date d'inscription 21 août 2007 Dernière intervention - 21 août 2007 à 00:22
0
Merci
En fait, Stream.size me renvoi une valeur négatif (-700 milles et quelques)mais quelques recherches m'ont permis de constater que c'est un souci souvent rencontré avec un fichier très très gros.
J'ai essayé avec soFromCurrent depuis le début ou la fin mais sans succès. Depuis le début, il fini par bloquer vers 2Go et depuis la fin, il n'arrive jamais à se positionner et reste à la position 0.

Simo'
Commenter la réponse de simoryl
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 21 août 2007 à 00:24
0
Merci
Salut,

Il est où ton fichier?
Dans quel support de stockage?
La mémoire ou un fichier disque?

De toute façon, il est trop gros pour être dans la mémoire locale.
Commenter la réponse de Caribensila
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 21 août 2007 à 00:32
0
Merci
...Et quand la mémoire globale dépasse 4Go, c'est Windows qui s'occupe d'en fournir.
Ca vient de là, à mon avis.
Commenter la réponse de Caribensila
Utilisateur anonyme - 21 août 2007 à 04:25
0
Merci
Salut,

"2Go" : ca serait pas un probleme de type ? tu aurait pas utiliser un integer par hasard? Si c'est le cas met le en Int64.
Commenter la réponse de Utilisateur anonyme
simoryl 5 Messages postés jeudi 20 mars 2003Date d'inscription 21 août 2007 Dernière intervention - 21 août 2007 à 11:19
0
Merci
je met bien en Int64 et en négatif quand j'utilise un soFromEnd. Sinon, le fichier est juste à côté de mon appli' sur le disque dur local.
Je précise qu'avec un fichier de 4.3Go c'est passé sans souci... Etrange...

Simo'
Commenter la réponse de simoryl
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 21 août 2007 à 11:26
0
Merci
"J'ai essayé de faire des seek successifs depuis le début du fichier pour arriver à la position souhaitée..."
 Une idée comme ça...:
-Peut-être essayer de lire, ne serait-ce qu'un octet, entre chaque seek...
Commenter la réponse de Caribensila
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 21 août 2007 à 12:26
0
Merci
Bonjour

Une autre idée en passant. Tu utilises un int64 comme définition de type, ok mais utilises tu une constante typée ?

  Stream.Seek( 1 shl 31, soFromCurrent);
  // 1 shl 31 = -2147483648 considéré par défaut comme un Integer (32bits)

  Stream.Seek( int64(1 shl 31), soFromCurrent);
//  int64(1 shl 31) = 2147483648, on oblige le compilateur à traiter la constante en tant que int64

N.B. Cela expliquerait également pourquoi un fichier plus gros fonctionne. Dans ce cas là tu dépasses forcément la limite de valeur que peut contenir un entier 32 bits, et le compilateur utilises un int64 pour pouvoir la stocker.

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
Commenter la réponse de WhiteHippo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.