Pregunta

Tengo una aplicación donde a veces necesito leer desde el archivo de escribirse en y como resultado de ser bloqueado. Como he entendido desde otra que debería tomar el IOException e intente de nuevo hasta que pueda leer.

Pero mi pregunta es ¿Cómo puedo saber con certeza que el archivo está bloqueado y que no es otro IOExcetpion que se produce.

¿Fue útil?

Solución

Cuando se abre un archivo para su lectura en .NET que en algún momento tratar de crear un identificador de archivo con el función API CreateFile que establece el código de error que se puede utilizar para ver qué ha fallado:

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

Otros consejos

Hay una discusión útil sobre grupos de Google la que realmente debería leer. Una de las opciones es cerca de Darin; Sin embargo, para garantizar que obtiene el error Win32 derecha, que realmente debería llamar a la OpenFile Win32 () de la API a sí mismo (de lo contrario, realmente no sabe qué error está recuperando).

Otra es la de analizar el mensaje de error: que se producirá un error si la aplicación se ejecuta en otra versión de idioma

.

Una tercera opción es modificar dentro de la clase de excepción con la reflexión para pescar el HRESULT real.

Ninguna de las alternativas son realmente tan atractiva: la jerarquía IOException se beneficiaría de unas pocas más subclases en mi humilde opinión.

Para leer los datos que puede hacer:

  

usando (FileStream fs = new   FileStream (nombre del archivo, FileMode.Open,   FileAccess.Read, FileShare.ReadWrite |   FileShare.Delete)) {....}

y ahorrar en el archivo:

  

usando (FileStream fs = new   FileStream (nombre del archivo, FileMode.APPEND,   FileAccess.Write, FileShare.Read |   FileShare.Delete)) {...}

Banderas al final de constructores describe lo que otro proceso puede hacer con el archivo. Está bien, por supuesto, si el usuario controla la escritura y lectura ...

Es posible abrirlo (como se describe por bezieur) luego tratar de bloquear las secciones (o archivo completo): http://www.java2s.com/Code/VB/File- Directorio / Lockandunlockafile.htm

¿Quieres decir que los dos están leyendo y escribiendo en el fichero? O que una aplicación externa está escribiendo en él.

Si usted está haciendo la lectura y la escritura entonces supongo que lo estás haciendo en distintos subprocesos en cuyo caso, echar un vistazo a la clase ReaderWriteLock que hacer esto de la gestión para usted, y le permiten proporcionar los tiempos de espera.

http://msdn.microsoft.com/en -us / biblioteca / system.threading.readerwriterlock.aspx

De lo contrario todo lo que tiene que hacer es abrir el archivo en un modo de sólo lectura. Entonces no debería tener ningún problema:

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));

Puede comparar contra el tipo IOException para comprobar y ver si no es otra cosa

como

if (ex is FileNotFoundException)

Es posible que desee buscar la ayuda de System.IO. Muchas de las excepciones en las que hereda la clase de IOException . Fuera de comprobación para ver si se trata de otro tipo de excepción que puede tener que mirar en el mensaje de la descripción o se puede intentar hacer una llamada a la API de Win32 en shell32.dll. Puede haber una función en allí para comprobar si un archivo está bloqueado.

Además, si es absolutamente necesario esperar a que puede utilizar bucle, pero si usted quiere hacer otras acciones mientras espera utilizar un hilo asíncrono.

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