Pregunta

ANTECEDENTES: Yo uso un desplazamiento en un archivo y el bloqueo Filestream / desbloquear menthods para controlar el acceso de lectura / escritura. Estoy utilizando el código siguiente para probar si un bloqueo se mantiene actualmente en el archivo

try
{
  fs.Lock( RESERVED_BYTE, 1 );
  fs.Unlock( RESERVED_BYTE, 1 );
  rc = 1;
}
catch
{ 
  rc = 0; 
}

PREGUNTA:
Mi objetivo es eliminar el bloque try / catch. ¿Hay alguna manera mejor para ver si existe la cerradura?

EDIT:
Nota: Esta pregunta no es sobre si existe el archivo. Ya sé que lo hace. Se trata de sincronizar el acceso de escritura.

¿Fue útil?

Solución

Puede llamar a la API LockFile de Windows función a través de la P / Invoke capa directamente. Se podría utilizar el asa devuelta por la propiedad SafeFileHandle en el FileStream.

Llamando a la API directamente le permitirá comprobar el valor de retorno para una condición de error en lugar de recurrir a la captura de una excepción.


Noah pregunta si hay ningún tipo de gastos en la fabricación de la llamada a la P / Invoke capa vs un try / catch.

El archivo de bloqueo hace que la misma llamada a través de la capa de P / Invoke y lanza la excepción si la llamada a LockFile devuelve 0. En su caso, usted no está lanzando una excepción. En el caso de que el archivo está bloqueado, se le llevará menos tiempo, ya que no se trata de una pila de desenrollado.

El real P / Invoke configuración es alrededor de siete instrucciones que yo creo (en comparación, la interoperabilidad COM es de aproximadamente 40), pero ese punto es discutible, ya que su llamada a LockFile es hacer la misma cosa que el método logrado hace (utilizar el P / Invoke capa).

Otros consejos

En lo personal me acaba de coger un archivo bloqueado al intentar abrirlo. Si está desbloqueado ahora, puede bloquearse cuando intenta abrirlo (incluso si es sólo unos pocos ms adelante).

  

Mi objetivo es eliminar el bloque try / catch

Recuerde que el sistema de archivos es volátil : sólo porque su archivo está en un estado de una operación no significa que vaya a estar en el mismo estado para la siguiente operación. Tienes que ser capaz de manejar excepciones del sistema de archivos.

En algunos casos también se puede utilizar WCT , por lo general es implmented por el depurador de perfiladores o, sin embargo, puede ser utilizado desde cualquier código como el requisito depurador habitual de ser el hilo que tiene el puerto de depuración abierta no es un pre-Requisit. Como tal WCT es una información muy completa y precisa sobre la contención de bloqueo.

A gestionados ejemplo (todo-ser-que algo trickey ), la utilidad del espectáculo para este sub-conjunto específico de los nativos de depuración de API en el CLR.

No creo que sea posible sin try, catch.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top