Comprobación de si el archivo ya está en uso antes de abrir (unidad de red, C #)

StackOverflow https://stackoverflow.com/questions/374155

  •  22-08-2019
  •  | 
  •  

Pregunta

¿Existe en modo alguno en .Net para comprobar si antes de abrir un archivo (en una unidad de red local) ya está en uso?

¿Fue útil?

Solución

Usted debe tratar de acceder a ella y si no, que o bien no tienen permisos necesarios (que se puede comprobar con GetAccessControl) o está bloqueado por otro proceso.

Pero no creo que haya ninguna medida fiable para distinguir un bloqueo y un fracaso permiso (puesto que podría ser capaz de leer el archivo, pero no es capaz de comprobar los permisos). Incluso mensaje de error de Windows' dice que o bien no tiene permiso o está siendo usado por otro proceso.

Puede utilizar la clase WMI para consultar CIM_DataFile InUseCount para un archivo de datos especificado.

Si usted está buscando un equivalente programática a lsof utilidad en Linux, para averiguar todos los archivos abiertos por un proceso dado local, se podría tratar de usar Win32_Process clase WMI a través del espacio de nombres System.Management. Se podría emitir una consulta WMI para buscar el nombre del archivo en todos los archivos abiertos siendo utilizado por todos los procesos locales también ver si está allí o no. Como alternativa, puede P / Invoke y el uso de la API NtQuerySystemInformation directamente a realizar la misma tarea.

Otros consejos

Esto va a hacer. FileShare.NONE como se menciona en MSDN:

  

Ninguna: La disminución compartir el archivo actual. Cualquier solicitud para abrir el archivo (por este proceso o en otro proceso) fallará hasta que el archivo está cerrado.

File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);

EDIT: Recuerde que debe envolver en un bloque try / catch, y el uso de FileShare.NONE en realidad significa que desea abrir el archivo exclusivamente

.
bool CanReadAndWrite(string path)
{
    var perm = new System.Security.Permissions.FileIOPermission(
         System.Security.Permissions.FileIOPermissionAccess.Write |
         System.Security.Permissions.FileIOPermissionAccess.Read,
         path);
    try
    {
         perm.Demand();
         return true;
    }
    catch 
    {
         return false;
    }
}

Comprueba si se puede leer y escribir en un archivo.

Uso System.IO.File.OpenWrite (ruta). Envolverlo en un bloque try / catch, y si ya está abierto para escribir en otro lugar, se obtiene un System.UnauthorizedAccessException.

La siguiente sintaxis ayudará a:

FileStream s2 = new FileStream (nombre, FileMode.Open, FileAccess.Read, FileShare.Read);

En general, siempre se debe evitar depender de cheques archivo de accesibilidad. La razón es que podría ser, y entonces puede cambiar sólo un par de ciclos antes de acceder a él.

En su lugar, sólo tratar de abrirlo y ver si tiene algún error.

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