IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

TFileStream : probleme de seek sur très gros fichiers


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 164
    Par défaut TFileStream : probleme de seek sur très gros fichiers
    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'

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 164
    Par défaut
    j'en ai trouvé une bonne qui coince tous le monde lol

  3. #3
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    La limite théorique d'un processus sous MS-Windows n'est-elle pas de 4Go ?

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    As-tu géré la taille avec une variable de type "Int64", si ce n'est pas le cas, c'est normal, le Integer se limite à 2 milliards environ puisse pas en négatif ...

    Les histoires de limite c'est à l'époque de Win95, non ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 164
    Par défaut
    j'utilise cette ligne de code pour me placer à environ 5Mo de la fin :
    fs.Seek(tailleEnd,soFromEnd);
    tailleEnd est égale à -5000000 et la variable est déclarée en Int64, c'est pour cela que je ne pige pas où est le problème...

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Si tu commence par la fin, il semble effectivement mettre en négatif, tu veux être positionné à 5Mo,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fs.Seek(-5242880, soFromEnd);
    cela ne devrait pas poser de problème ... c'est en accord avec l'API Windows

    comme j'utilise souvent les API, je ne gère que rarement le déplacement depuis la fin, tient un code qui permet d'écrire une chaine à la toute fin d'un fichier via API

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure WriteStringAtEnd(const FileName: string; const NewValue: string);
    var
      FileHandle: THandle;
      AmtTransferred: Cardinal;
      StartPosition: Int64;
    begin
      FileHandle := CreateFile(PChar(FileName), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      try
        Int64Rec(StartPosition).Lo := GetFileSize(FileHandle, @Int64Rec(StartPosition).Hi);
        Dec(StartPosition); // La Dernière Position
        Dec(StartPosition, Length(NewValue)); // La Position
        SetFilePointer(FileHandle, Int64Rec(StartPosition).Lo, @Int64Rec(StartPosition).Hi, FILE_BEGIN);
        WriteFile(FileHandle, NewValue[1], Length(NewValue), AmtTransferred, nil);
      finally
        CloseHandle(FileHandle);
      end;
    end;
    SetFilePointer c'est un seek, mais tu noteras, que je préfère calculer moi même la position depuis FILE_BEGIN ...

    tu peux faire donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fs.Seek(fs.size - 5242880, soFromBeginning);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Problème graveur ide sur mdk10
    Par Hanslip dans le forum Matériel
    Réponses: 40
    Dernier message: 26/10/2004, 13h17
  2. Problème de BOOT sur CD pour une installation d'une DEBIAN
    Par black is beautiful dans le forum Debian
    Réponses: 7
    Dernier message: 22/09/2004, 21h15
  3. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  4. [C#] problème si clic sur "précédent"
    Par moimoimoi dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/03/2004, 15h30
  5. probleme d'installation sur d'autres postes
    Par VBkiller dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/09/2002, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo