2011-03-17 6 views
6

Pruébelo usted mismo:¿Cómo puede CreateFile fallar con FILE_SHARE_READ y tener éxito con FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE?

Cree un archivo XLS, ábralo en Excel.

Abra sysinternals Process Monitor, y observe lo que ocurre mientras hace una copia de su archivo XLS en el explorador (simplemente pulse ctrl-c ctrl-v).

Dos llamadas a ::CreateProcess en una fila. La primera llamada solicita permisos de lectura y obtiene acceso denegado. La segunda llamada pide leer más escribir más borrar y pasar.

¿Eso es normal?

Respuesta

11

Si abre un archivo con FILE_SHARE_READ, está diciendo que está dispuesto a compartir el acceso a este archivo, pero solo para lecturas.

Si abre con todas las banderas, está dispuesto a compartir el acceso también para escrituras/eliminar.

FILE_SHARE_READ es más restrictivo que FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE

Si algún otro proceso (Excel) tiene este archivo abierto para, por ejemplo, escribe (y tiene los indicadores de compartir configurados), la única manera en que puedes acceder es aceptar compartirlo para escribir.

3

Tiene que usar modos de uso compartido compatibles. Si Excel abre el archivo con FILE_SHARE_READ | FILE_SHARE_WRITE y los intentos subsiguientes para abrir el archivo deben usar al menos esos mismos indicadores. Específicamente de la MSDN documentation on CreateFile:

No se puede solicitar un modo de uso compartido que entra en conflicto con el modo de acceso que se especifica en una solicitud existente que tiene un identificador abierto. CreateFile fallaría y la función GetLastError devolvería ERROR_SHARING_VIOLATION.

Cuestiones relacionadas