Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    1,003

    [delphi] leggere/scrivere su file binari

    ho la necessità di dover sostituire alcune stringhe presenti in un file binario.
    su internet ho trovato qualke funzione ma purtroppo funziona solo se la stringa da sostituire ha la stessa lunghezza di quella sostituita.
    qualkuno di voi ha trovato una soluzione?





  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Se si tratta di un file binario, parlare di "stringa" comincia a perdere significato, poichè un file binario viene manipolato come un insieme di byte, anche se è vero che è possibile inserire nel file i codici corrispondenti ai singoli caratteri della stringa come valori numerici.

    Credo che la classe più appropriata sia TMemoryStream, discendente di TStream, che consente di accedere ad un buffer di memoria per inserire ed estrarre dati come se si trattasse di un "registratore a nastro", con la possibilità di caricare i dati da un file e salvarli nuovamente al termine del processo.

    Creata la classe TMemoryStream, è possibile utilizzare il metodo LoadFromFile per caricare al suo interno i dati binari del file specificato; il metodo Write consente di scrivere nuovi dati all'interno dello stream partendo dalla posizione corrente, che può essere spostata utilizzando il metodo Seek. Il paragone con un "registratore a nastro" è perfettamente calzante, poichè la Write sovrascrive i dati, pertanto sarà necessario creare più MemoryStream, uno per caricare l'intero file, un secondo nel quale copiare i dati del file originale contenuti nel primo stream al quale dovrà essere accodata la stringa da inserire (fino al punto di inserimento) cui seguirà la parte rimanente dei dati contenuti nel primo stream.

    In pratica, è come registrare su una nuova cassetta il contenuto iniziale di una cassetta originale A (fino ad un certo punto), a cui viene fatto seguire il contenuto di una cassetta B, poi si prosegue registrando sulla nuova cassetta ciò che rimaned della A.

    Non ho molto tempo di produrre codice, ma spero di averti dato sufficienti indicazioni per poter tentare qualche prova, magari aiutandoti con la Guida in linea per ottenere informazioni sui metodi e le proprietà degli Stream disponibili.

    Ciao!

    P.S.: ottima firma! :adhone:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    1,003
    grazie della risposta ma sinceramente nn c'ho capito molto

    in pratica devo fare due memorystream, uno dall'inizio del file fino al punto dove incomicia il dato da sostituire e uno ke parte dalla fine del dato cercato fino alla fine del file, dopodike sbatterci dentro il dato modificato ed unire tutto ed infine alvare giusto?




  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Crei due MemoryStream, uno che rappresenta il file di partenza, uno che rappresenta il file di arrivo.

    Nel primo stream, attraverso la LoadFromFile, carichi tutto il file originale. Nello stream legato al file di destinazione, copi la parte dello stream originale inclusa tra l'inizio dello stream e il punto in cui vuoi inserire nuovi dati; attraverso il metodo Write, scrivi sul secondo stream del file di destinazione la stringa da aggiungere, infine scrivi lo stream originale (dalla posizione in cui era rimasto) sullo stream di destinazione i dati fino al raggiungimento della fine del file originale.
    Concluso il processo, salvi il contenuto del secondo stream in un file esterno.

    Concettualmente, scrivi su un file la prima parte dei dati originali, accodi la stringa e infine scrivi l'ultima parte.

    E' possibile sapere a cosa ti serve tutto questo?
    Magari esistono metodi più semplici...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    1,003
    Originariamente inviato da alka
    Crei due MemoryStream, uno che rappresenta il file di partenza, uno che rappresenta il file di arrivo.

    Nel primo stream, attraverso la LoadFromFile, carichi tutto il file originale. Nello stream legato al file di destinazione, copi la parte dello stream originale inclusa tra l'inizio dello stream e il punto in cui vuoi inserire nuovi dati; attraverso il metodo Write, scrivi sul secondo stream del file di destinazione la stringa da aggiungere, infine scrivi lo stream originale (dalla posizione in cui era rimasto) sullo stream di destinazione i dati fino al raggiungimento della fine del file originale.
    Concluso il processo, salvi il contenuto del secondo stream in un file esterno.

    Concettualmente, scrivi su un file la prima parte dei dati originali, accodi la stringa e infine scrivi l'ultima parte.

    E' possibile sapere a cosa ti serve tutto questo?
    Magari esistono metodi più semplici...
    ma come faccio ad indirizzare la funzione write in un determianto punto del file?
    la funzione seek funziona solo col vekkio metodo (assign...)

    ah, mi serve per sostituire delle scritte ad degli eseguibili invece di ricompilarli




  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da tia86
    ah, mi serve per sostituire delle scritte ad degli eseguibili invece di ricompilarli
    Non credo che sia il metodo giusto per fare ciò che chiedi, poichè potresti denaturare il file eseguibile spostando dati dalla loro posizione originale o aumentando/diminuendo la loro dimensione.

    Usa un approccio diverso, ad esempio un file di risorse in cui inserire le stringhe da caricare.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Ciao alka piacere di conoscerti.... io ho lo stesso problema.. devo dire una cosa pero'... la procedura l'ho capita, ho creato 2 stream nel primo ho caricato tutto il contentuto del file exe originario e il secondo sara' quello di destinazione... e fin qui ci siamo.
    Ora quello che non riesco proprio a capire e':
    il metodo seek serve per localizzare una posizione specifica nel exe dove scrivere i dati...e salvarli nel secondo stream.
    la mia domanda e' questa.... COME FACCIO A TROVARE IL PUNTO CHE MI INTERESSA DA MODIFICARE? grazie per l'aiuto.... sarei felicissimo se tu mi facessi avere un piccolo sorgente per cercare di capire meglio... mi sto muovendo nel buio....
    GRAZIE

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.