Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - offsets di un file esistente su disco fisso.
Forum - C# / VB.NET - offsets di un file esistente su disco fisso.

Avatar
Osiride80 (Normal User)
Newbie


Messaggi: 13
Iscritto: 20/05/2010

Segnala al moderatore
Postato alle 21:07
Domenica, 27/05/2012
Ciao a tutti,

ho un bisono di una mano da chi è piu pratico di me per risolvere un problema che mi sta bloccando nella stesua di codice per un programma che devo ultimare a breve.

L'ambiete di sviluppo è visual studio net, il linguaggio VB.net.

La mia domanda è: esiste un modo per ricavare l'offset iniziale e finale di un file residente su disco, partendo dal suo solo nome?

un operazione inversa, cioè ottenere un file tramite gli offset ed iniziale e finale, si ottiene usando questa API

    Public Declare Auto Function ReadFile Lib "Kernel32.dll" ( _
        ByVal hndRef As Integer, ByVal lpBuffer As Byte(), _
        ByVal numberOfBytesToRead As Integer, ByRef numberOfBytesRead As Integer, ByRef Overlapped As System.Threading.NativeOverlapped) As Boolean


A me interesserebbe sapere se esiste un'API equivalente per quello che dovrei fare io.

Ringrazio in anticipo quanti mi potranno aiutare.

Ciao

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:34
Domenica, 27/05/2012
Ma cosa intendi di preciso con "offset di un file" ?

O non hai spiegato chiaramente cosa vorresti ottenere o sei completamente fuori strada.

E che c'entra la ReadFile?

Ultima modifica effettuata da nessuno il 27/05/2012 alle 21:52


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Osiride80 (Normal User)
Newbie


Messaggi: 13
Iscritto: 20/05/2010

Segnala al moderatore
Postato alle 12:11
Lunedì, 28/05/2012
Ciao,

grazie per avermi risposto, ho notato che ho omesso una parte nella spiegazione e vedo se riesco a spiegarmi meglio.

Con offset iniziale intendo la posizione sul disco fisso del punto, espresso in byte, da cui inizia il file, e offset finale il punto espresso in byte del punto in cui finisce. La differenza tra l'offeset finale e quello iniziale mi restituisce la dimensione in byte del file interessato.

in questo modo tramite la funzione readfile:
    Public Declare Auto Function ReadFile Lib "Kernel32.dll" ( _
        ByVal hndRef As Integer, ByVal lpBuffer As Byte(), _
        ByVal numberOfBytesToRead As Integer, ByRef numberOfBytesRead As Integer, ByRef Overlapped As System.Threading.NativeOverlapped) As Boolean

passando tra i parametri richiesti l'offest iniziale e finale del file, riempio un buffer con i dati che compongono il file, per poi scriverne uno identico tramite le funzioni createfile e writefile:

    Public Declare Auto Function CreateFile Lib "kernel32.dll" (ByVal lpFileName As String, _
        ByVal dwDesiredAccess As Int32, ByVal dwShareMode As Int32, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, _
        ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, ByVal hTemplateFile As IntPtr) As Integer


    Public Declare Auto Function WriteFile Lib "kernel32.dll" ( _
    ByVal hndRef As Integer, ByVal lpBuffer As Byte(), _
    ByVal numberOfBytesToWrite As Integer, ByRef numberOfBytesWritten As Integer, ByRef Overlapped As Long) As Boolean 'System.Threading.NativeOverlapped) As Boolean


Con l'API CreateFile trovo il "PhysicalDiskHandle" del file appena letto, che assegno al primo parametro dell'API WriteFile, il secondo parametro è il buffer che ho dimensionato, il terzo riguarda la dimensione totale del buffer da scrivere, il quarto parametro restituisce i byte scritti.

In pratica con questa operazione riesco a creare una copia di un file, ma a me servirebbe sapere se c'è una qualche api che mi consente di trovare gli offest iniziali e finali di un file, passando all'Api le informazioni che lo riguardano. In tal modo potrei usare le Api sopra scritte per creare una copia del file interessato.

Il motivo di tutto questo lavoro intricato sta nel fatto che la copia del file che mi interesserebbe fare, non la creerei utilizzando il nome (con la classica funzione File.copy), ma solo le informazioni riguardanti i suoi offsets.

Spiegare non è mai facile, soprattutto se si vuole tentare di fare qualcosa non sapendo esattamente come procedere per questo ho preferito chiedere a chi è più informato di me in merito a questa cosa.

Un grazie in anticipo
ciao

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:36
Lunedì, 28/05/2012
Penso proprio che ci siano degli equivoci di base.

Intanto da dove inizia un file su disco dipende dal tipo di filesystem con cui è formattato il disco (anzi, la partizione).

Ad esempio, per FAT (nelle varie versioni) esiste un'area apposita che contiene il "nome del file" e il suo punto di inizio nel disco. Ma così trovi il primo "cluster" utilizzato per il file e non è detto che il resto sia in sequenza; il prossimo pezzo di file dipende dalle informazioni contenute nella tabella detta appunto File Allocation Table e può essere ovunque nel disco.

A grandi linee, quando leggi il file dal disco, il sistema parte dal nome (che cerca nell'area iniziale della directory) e legge da quest'area anche la lunghezza in byte e il cluster iniziale; poi, seguendo la catena della FAT, legge tutti gli altri pezzi fino all'ultimo cluster utilizzato.

Per NTFS è ancora più complesso e per altri filesystem può essere abbastanza diverso.

La ReadFile non vuole affatto come parametro un offset iniziale o finale del file inteso in questo modo (dove li vedi?). Forse non hai letto bene la documentazione sulla API ReadFile e i suoi parametri. Ti consiglio di studiarla bene.

In pratica la ReadFile legge un file a partire da un handle che hai ottenuto con la CreateFile e il nome del file.

Detto questo, dovrai rivedere il tuo progetto perché quello che chiedi non è fattibile e comunque non in questo modo.

Ultima modifica effettuata da nessuno il 28/05/2012 alle 18:36


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Osiride80 (Normal User)
Newbie


Messaggi: 13
Iscritto: 20/05/2010

Segnala al moderatore
Postato alle 12:18
Martedì, 29/05/2012
Ciao,

grazie per la risposta che mi hai dato, sei stato molto chiaro e preciso.

Per il lavoro che devo svolgere seguirò sicuramente un'altra via, anche perchè quello che mi dava più da pensare era proprio il fatto di come trovare i punti di inizio e di fine di un file, operazione che immaginavo fosse parecchio intricata.

Ti ringrazio per il tempo che mi hai dedicato e per la celerità delle tue risposte.

Saluti

(La discussione si può chiudere qui!)

PM Quote