2009-03-18 7 views

Respuesta

2

Si usted tiene el control del primer proceso puede especificar archivo de mango tipo de recurso compartido

string contents1; 
string contents2; 
using (FileStream fs1 = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
{ 
    using (var tr1 = new StreamReader(fs1)) 
    { 
     using (FileStream fs2 = new FileStream("test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     { 
      using (var tr2 = new StreamReader(fs2)) 
      { 
       contents2 = tr2.ReadToEnd(); 
       contents1 = tr1.ReadToEnd(); 
      } 
     } 
    } 
} 

Console.WriteLine(contents1); 
Console.WriteLine(contents2); 
+0

No tengo control del proceso que bloquea el archivo. – Malfist

9

Esta pregunta es bastante viejo ya, así que mi respuesta podría no ser de mucha utilidad para usted, pero siendo así que un Q & Un sitio quizás todavía ayude a alguien más.

no puedo/no quiero poner toda la implementación, pero el procedimiento es más o menos así:

  1. Se crea una instantánea de volumen a través del Servicio de instantáneas de volumen de Proveedores para la unidad donde se encuentra el archivo que se va a leer (esto está bien documentado en MSDN, también hay un cliente de muestra que crea estas instantáneas y probablemente sea suficiente)

  2. Haga una persistente o use el mecanismo de "devolución de llamada" (llama a su aplicación)

  3. Abrir el archivo deseado a través de las rutas UNC y CreateFile (UNC es como la siguiente: \\ \ GlobalRoot \ Dispositivos \ HarddiskVolumeShadowCopyXZY \ YourPath \ yourfile.yourextension?)

  4. Haz lo que quieras con el archivo

  5. Si ha cometido un VSC persistente se debe utilizar el cliente de ejemplo para eliminarlo después de que haya terminado

información más aquí: http://technet.microsoft.com/en-us/library/cc785914%28WS.10%29.aspx y aquí: http://msdn.microsoft.com/en-us/library/bb968832%28VS.85%29.aspx

+2

El problema es que las herramientas de administración de archivos integradas de .NET no pueden acceder a las directivas \\? \ GlobalRoot. De hecho, tienes que bajar al nivel de winapi. Hay una biblioteca llamada AlphaFSS que sí puede, pero tiene algunos problemas importantes. Lo usé por un tiempo, pero tuve problemas con el tamaño de archivo requerido para que DWORD representara su tamaño, AlphaFSS solo lee el DWORD más bajo. – Malfist

Cuestiones relacionadas