Exclusividad de archivos

Necesito saber cómo hacer en VB.NET o C# para saber si un archivo está siendo utilizado por otro programa. Que al menos me devuelva un boolean.
Además necesitaría saber cómo puedo tomar como exclusivo un archivo para que otro proceso no pueda abrirlo.
Muchas gracias de antemano!
Te mando muchos besos
Romí

8 Respuestas

Respuesta
1
Listo mira:
Todo lo que tu necesitas lo puedes hacer utilizando la clase de .NET FileIOPermission. Esta clase te permite truncar archivos ycarpeta, lo que pasa es que te toca tener mucho cuidado sobre lo que vas a bloquear.
Obviamente puedes combianar esta clase con otras.
Revisa los metodo FileInfo. Open. Este metodo te permite especificar como quieres abrir un archivo yal abrirlo puedes usar lo miembros de FileIOPermission para bloquear lo que necesites.
No te doy ejemplos porque nunca lo he hecho, pero ya me he documentado sobre el asunto y sé que esa clase te permite hacer lo que necesitas.
Respuesta
1
Mirate la siguiente documentación:
Para abrir un archivo:
[url|http://msdn2.microsoft.com/es-es/library/afh37kh8.aspx]http://msdn2.microsoft.com/es-es/library/afh37kh8.aspx[/url]
Para establecer los atributos del archivo (indicar que sea de acceso exclusivo)
[url|http://msdn2.microsoft.com/es-es/library/1t5w326w.aspx]http://msdn2.microsoft.com/es-es/library/1t5w326w.aspx[/url]
Para saber si un archivo ya esta abierto solo tienes que intentar abrirlo en modo de lectura y escritura con fileopen, si el archivo ya esta abierto se produce una excepción, solo tienes que controlar la excepción, el numero de excepción que indica que el archivo ya esta abierto es el 55
[url|http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vblr7/html/vastmopen.asp]http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vblr7/html/vastmopen.asp[/url]
Respuesta
1
Pues la manera seria intentar abrir el archivo y si esta siendo utilizado te arrojara una exccepcion, seria lago como esto:
try
   streamreader.Open("C:\Archi.txt")
catch ex as exception
' El archivo esta abierto
end try
Eso es más la lógica que el código que necesitas, me imagino que ya sabes que para abriri una archivo utilizas un streamReader de la clase System. IO.
Para abrirlo y tomarlo exclusivo que otro proceso no pueda abrirlo es una parámetro a la hora de abrir el archivo.
Respuesta
1
En cuanto a la primera pregunta, puedes utilizar el clásico truco de intentar abrir un fichero en modo exclusivo dentro de un bloque try catch y no propagar el error.
try
File.Open(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
 catch ex
blnEstaAbierto=true
end try
En cuanto a la segunda, te envío el código para bloquear y desbloquear un fichero de texto. Espero que te sirva:
[color=#0000ff]Imports<font size="2"> System.IO[/color]
</font>[color=#0000ff]Module[/color][color=#0000ff]Sub[/color][color=#0000ff]Dim[/color][color=#0000ff]As[/color][color=#0000ff]New[/color][color=#0000ff]Try[/color]
</font>[color=#0000ff]Catch[/color][color=#0000ff]As[/color][color=#0000ff]End[/color][color=#0000ff]Try[/color]
</font>[color=#0000ff]Try[/color]
</font>[color=#0000ff]Catch[/color][color=#0000ff]As[/color][color=#0000ff]End[/color][color=#0000ff]Try[/color]
</font>[color=#0000ff]Dim[/color][color=#0000ff]As[/color][color=#0000ff]Byte[/color][color=#0000ff]New[/color][color=#0000ff]Byte[/color][color=#0000ff]Try[/color]
</font>
</font>[color=#0000ff]Catch[/color][color=#0000ff]As[/color][color=#0000ff]End[/color][color=#0000ff]Try[/color]
</font>[color=#0000ff]End[/color][color=#0000ff]Sub[/color][color=#0000ff] End<font size="2"> [/color][color=#0000ff]Module[/color]
</font>
Respuesta
1
La función que te podria servir es FileOpen(). Aca te dejo un link que te expilca e detalle como usarla. El parametro Share especifica las operaciones restringidas por otros procesos en el archivo abierto: Shared, Lock Read, Lock Write y Lock Read Write. De forma predeterminada es Lock Read Write.
http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vblr7/html/vastmOpen.asp
Respuesta
1
Para tomarlo de manera exclusiva tendrías que tratarlo como a una base de datos son oledb
en lugar de poner la ruta de la base de datos pones la ruta del archivo de texto y hay una propiedad dentro de la conexión que te permite tomarlo de forma exclusiva no lo recuerdo en este momento pero es algo como exclusive o algo así
La otra es hacerlo con el api de windows llamando al archivo desde la función call del kernel
esto lo tomaría de forma exclusiva
Respuesta
1
disculpe por demorar  sabemos la palabra reservada boolean es decir solo devuelve el true o false Ahora te voy a dar un pequeño ejemplo para ud entiendan...
public class Paciente{
private double Costo,Descuento;
private int Dias;
private char TipoSeguro;
}
private void ingresaDias(string s1){
Dias=int.Parse(s1);
}
public void ingresaTipo(boolean b1,boolean b2){
if(b1==true)TipoSeguro='S';
else if(b2==true)TipoSeguro='E';
else TipoSeguro='F';
}
Respuesta
1
Ya contestar consultas en este medio se me esta haciendo imposible, por el escaso tiempo que tengo, ahora estoy de lleno respondiendo todo en mi propio foro forosdotnet.com entra ahí y te ayudo en todo lo que necesites
forosdotnet.com

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas