gpnet
01-02-2009, 23:28
Ciao a tutti ,
Stavo cercando aiuto ad un problema strano che mi capita usando l'oggetto filestream. In particolare avevo bisogno di condividere un file fra diversti utenti e cosi ho codificato queste linee di codice che qui riporto in parte per facilità di lettura :
. . .
. . .
public enum dbLockType { _none =0, _lock, _unLock, _default}
long lockPos = -1;
long lockRec = -1;
FileStream DtFile = new FileStream(@"\\server\d\folder\test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,8000);
. . .
. . .
public bool getBufferFromDisk(long RecordNumber, byte[] toArray, int startingAt, int length, dbLockType dbLock)
{
long seekPosition = GetFilePos(RecordNumber);
try {
DtFile .Seek(seekPosition, System.IO.SeekOrigin.Begin);
DtFile .Read(toArray, startingAt, length);
if ( dbLock == dbLockType._lock) {
if ( lockPos > -1)
DtFile .Unlock(lockPos, blockSize); // unlock previous locks
DtFile .Lock(seekPosition, blockSize);
lockPos = seekPosition;
lockRec = RecordNumber;
}
}
catch(IOException e) {
return false;
}
return true;
}
nella main il primo utente esegue la funzione getBufferFromDisk con questi parametri :
getBufferFromDisk(8, toArray, 500, 100, dbLock);
in questo modo legge e blocca il filestream alla pos 500 per 100 bytes.
Il secondo utente lo stesso pgm da una altro PC e cerca di eseguire la stessa funzione con i seguenti parametri:
getBufferFromDisk(0, toArray, 0, 100, dbLock);
è in questo punto che viene gererato l'errore di lettura a questa specifica.
DtFile .Read(toArray, startingAt, length);
così ho inserito il blocco Try-catch per protezione.
Strano , ho pensato, perchè il primo utente ha bloccato 100 bytes a partire dalla pos 500 e non dalla Pos 0.
Dopo un po di googling ho trovato questo articolo che forse riprende il mio caso : www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic15633.aspx
Così ho giocato un po per capire meglio il problema e ho trovato che :
1. anche se viene modificata la lettura in .Read ( tenendo il primo user con il pgm aperto e la pos loccata ) il secondo utente trova sempre la posizione 0 loccata.
2. Il lock è esteso all'intero buffer , che è di 8K.
3. Tutto questo è vero se il secondo utente cerca di leggere qualcosa in questo buffer se qualcosa in questo buffer è loccato , altrimenti tutto fila liscio senza exceptions. Voglio dire che se il primo user locca qualcosa alla posizione 8500 , 100 il secondo utente che legge alla pos. 0 non ha nessun problema.
Cosa è questo ? , un bug? Sto sbagliando io qualcosa nella codifica o che cosa? E' questo il modo corretto di lavorare con lock e unlock
Qualcuno può aiutarmi a risolvere il problema
grazie a tutti ,
JossGP
Stavo cercando aiuto ad un problema strano che mi capita usando l'oggetto filestream. In particolare avevo bisogno di condividere un file fra diversti utenti e cosi ho codificato queste linee di codice che qui riporto in parte per facilità di lettura :
. . .
. . .
public enum dbLockType { _none =0, _lock, _unLock, _default}
long lockPos = -1;
long lockRec = -1;
FileStream DtFile = new FileStream(@"\\server\d\folder\test.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,8000);
. . .
. . .
public bool getBufferFromDisk(long RecordNumber, byte[] toArray, int startingAt, int length, dbLockType dbLock)
{
long seekPosition = GetFilePos(RecordNumber);
try {
DtFile .Seek(seekPosition, System.IO.SeekOrigin.Begin);
DtFile .Read(toArray, startingAt, length);
if ( dbLock == dbLockType._lock) {
if ( lockPos > -1)
DtFile .Unlock(lockPos, blockSize); // unlock previous locks
DtFile .Lock(seekPosition, blockSize);
lockPos = seekPosition;
lockRec = RecordNumber;
}
}
catch(IOException e) {
return false;
}
return true;
}
nella main il primo utente esegue la funzione getBufferFromDisk con questi parametri :
getBufferFromDisk(8, toArray, 500, 100, dbLock);
in questo modo legge e blocca il filestream alla pos 500 per 100 bytes.
Il secondo utente lo stesso pgm da una altro PC e cerca di eseguire la stessa funzione con i seguenti parametri:
getBufferFromDisk(0, toArray, 0, 100, dbLock);
è in questo punto che viene gererato l'errore di lettura a questa specifica.
DtFile .Read(toArray, startingAt, length);
così ho inserito il blocco Try-catch per protezione.
Strano , ho pensato, perchè il primo utente ha bloccato 100 bytes a partire dalla pos 500 e non dalla Pos 0.
Dopo un po di googling ho trovato questo articolo che forse riprende il mio caso : www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic15633.aspx
Così ho giocato un po per capire meglio il problema e ho trovato che :
1. anche se viene modificata la lettura in .Read ( tenendo il primo user con il pgm aperto e la pos loccata ) il secondo utente trova sempre la posizione 0 loccata.
2. Il lock è esteso all'intero buffer , che è di 8K.
3. Tutto questo è vero se il secondo utente cerca di leggere qualcosa in questo buffer se qualcosa in questo buffer è loccato , altrimenti tutto fila liscio senza exceptions. Voglio dire che se il primo user locca qualcosa alla posizione 8500 , 100 il secondo utente che legge alla pos. 0 non ha nessun problema.
Cosa è questo ? , un bug? Sto sbagliando io qualcosa nella codifica o che cosa? E' questo il modo corretto di lavorare con lock e unlock
Qualcuno può aiutarmi a risolvere il problema
grazie a tutti ,
JossGP