Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    6

    Files di grandi dimensioni

    Salve a tutti,

    ho un problema con la gestione di files di grandi dimensioni, oltre 2GB.

    Il programma riportato di seguito funziona per files di piccole dimensioni, ma non riesce a leggere neanche un carattere di un file di grandi dimensioni, restituendomi tutti blanks. C'è un errore? E se si dove?

    Grazie per l'aiuto.

    ************************************************** ********

    Dim sBuffer As String
    Dim iBytesRead As Long
    Const kCharToRead = 10
    Const kStartPos = 10

    hFile = CreateFile("c:\a\a.txt", GENERIC_READ, FILE_SHARE_READ, 0&, OPEN_EXISTING, 0&, 0)
    Call SetFilePointer(hFile, kStartPos, 0, FILE_BEGIN) ' low, high
    '
    sBuffer = Space(kCharToRead) ' buffer in cui vanno i bytes letti
    Call ReadFile(hFile, ByVal sBuffer, kCharToRead, iBytesRead, ByVal CLng(0))
    '
    CloseHandle hFile

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioe' ? Se il file e' grande non riesci a leggere nulla ?

    La seek prevede la parte bassa del puntatore (che e' limitata a 2 G) e la parte alta (che se e' NULL non viene presa in considerazione).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    6
    Si, esatto. Se il file è oltre i 2GB le medesime istruzioni mi tornano una stringa con tutti blank. Lo stesso non accade per file minori di 2GB.

    Sulla base di come è scritto il programma dovrei, come minimo, riuscire a leggere i caratteri della prima parte del file, ma questo non avviene.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma quando fai la prova (che non ha successo) con i file grandi, dove posizioni il puntatore e quanti byte leggi?

    Cioè, con precisione, quali sono i valori esatti dei parametri che passi quando hai il problema ?

    Non quelli che pensi debbano essere, ma quelli che hai visto durante il debug ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    6
    Sono quelli riportati nel listato a video (che èun esempio per capire dove sbaglio) e definiti tramite costanti: posiziono al 10^ carattere del file e leggo i 10 caratteri successivi

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per replicare il problema dovresti postare le dichiarazioni delle API e delle costanti che hai usato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    6
    Di seguito il programma completo

    Declare Function ReadFile Lib "kernel32" _
    (ByVal hFile As Long, _
    lpBuffer As Any, _
    ByVal nNumberOfBytesToRead As Long, _
    lpNumberOfBytesRead As Long, _
    ByVal lpOverlapped As Long) As Long
    Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As Long) As Long
    Declare Function CreateFile Lib "kernel32" _
    Alias "CreateFileA" (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, _
    ByVal lpSecurityAttributes As Long, _
    ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long
    Declare Function SetFilePointer Lib "kernel32" _
    (ByVal hFile As Long, _
    ByVal lDistanceToMove As Long, _
    lpDistanceToMoveHigh As Long, _
    ByVal dwMoveMethod As Long) As Long
    Global hFile As Long
    Global Const FILE_BEGIN = 0, FILE_CURRENT = 1, FILE_END = 2



    Const GENERIC_READ = &H80000000
    Const FILE_SHARE_READ As Long = &H1&
    Const OPEN_EXISTING As Long = 3&

    Dim sBuffer As String
    Dim iBytesRead As Long
    Const kCharToRead = 10
    Const kStartPos = 10

    hFile = CreateFile("c:\a\a.txt", GENERIC_READ, FILE_SHARE_READ, 0&, OPEN_EXISTING, 0&, 0)
    Call SetFilePointer(hFile, kStartPos, 0, FILE_BEGIN) ' low, high
    '
    sBuffer = Space(kCharToRead) ' buffer in cui vanno i bytes letti
    Call ReadFile(hFile, ByVal sBuffer, kCharToRead, iBytesRead, ByVal CLng(0))
    '
    CloseHandle hFile

    In sBuffer dovrei avere la stringa, ma in realtà mi ritrovo una sequela di "?".

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Allora ... ho provato il tuo codice con un file da 1 k e con file da piu' di 2 G e funziona ugualmente ...

    Dai maggiori indicazioni sul problema ...

    (Naturalmente ho provato con file di testo ... )
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    6
    Allora,
    dopo questo scambio di email ho fatto delle prove ulteriori e sono riuscito a farlo funzionare in parte esattamente nel modo riportato nel listato. In parte in quanto mi funziona solo con la prima parte del file, ossia mi legge i caratteri dei primi due giga. Il problema nasce quando cerco di accedere ai restanti due giga, imposto ad 1 il parametro della parte alta, invece di 0,

    Call SetFilePointer(hFile, kStartPos, 1, FILE_BEGIN) ' low, high

    ma mi legge solo spazi bianchi.
    Come devo valorizzare il parametro?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da FM01967
    Allora,
    dopo questo scambio di email ho fatto delle prove ulteriori e sono riuscito a farlo funzionare in parte esattamente nel modo riportato nel listato. In parte in quanto mi funziona solo con la prima parte del file, ossia mi legge i caratteri dei primi due giga.
    Cosa che quel programma aveva sempre fatto. E infatti, mi stavo scervellando su come non ti funzionasse ... a questo punto, tu non l'avevi mai provato ...

    Il problema nasce quando cerco di accedere ai restanti due giga, imposto ad 1 il parametro della parte alta, invece di 0,

    Call SetFilePointer(hFile, kStartPos, 1, FILE_BEGIN) ' low, high

    ma mi legge solo spazi bianchi.
    Come devo valorizzare il parametro?
    Ecco ... e' questo il problema vero ... ma se leggi la documentazione su MSDN

    SetFilePointer
    http://msdn.microsoft.com/en-us/library/aa365541(VS.85).aspx

    vedi facilmente che il parametro

    __inout_opt PLONG lpDistanceToMoveHigh,

    e' un puntatore a long, quindi dovresti usare una variabile

    Dim ha As Long

    ha = 1

    e usare la variabile che sarà passata per riferimento

    Call SetFilePointer(hFile, kStartPos, ha, FILE_BEGIN) ' low, high
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.