2012-07-03 19 views
12

Lo que trato de hacer es que mientras mi programa esté usando un archivo, quiero evitar que el usuario cambie el nombre, elimine o mueva el archivo (bueno ... a mover es una eliminación y una creación en una ubicación diferente según Windows FileSystemWatcher, pero estoy divagando). Se ha sugerido que use FileStream.Lock o use un Mutex. Sin embargo, FileStream.Lock parece solo evitar que se modifique el archivo que estoy tratando de permitir. Además, no estoy muy seguro de si un mutex puede bloquear un archivo, aunque todavía estoy leyendo en la biblioteca .Net 4.0.Impedir que un usuario elimine, mueva o cambie el nombre de un archivo

¿Alguien tiene algún consejo sobre la utilización de uno y si hay una solución basada en código para este problema?

+0

Esto suena como un caso de uso muy inusual. Tengo curiosidad de cómo te has encontrado en esta situación ... ¿te importa explicar más? Tal vez hay una solución arquitectónica. – JDB

Respuesta

19

Al abrir el archivo, puede especificar el modo de compartir.

Abrir el archivo con FileAccess.Read le da la capacidad de leer el archivo, mientras que FileShare.ReadWrite permite que el archivo continúe siendo editado, pero no eliminado ni movido.

var fs = File.Open(@"C:\temp\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
MessageBox.Show("File Locked"); // While the messagebox is up, try to open or delete the file. 
// Do your work here 
fs.Close(); 
+0

Wow, esto incluso impide cambiar el nombre de los archivos. Gracias por esto, esto funcionará mejor de lo que pensaba, ya que incluso arroja los cuadros de Microsoft: D –

3

Esto evitará que mover o eliminar el archivo, pero permite leer y escribir:

using (FileStream fs = new FileStream(@"C:\TestDir\Test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     // Do Stuff. 
    } 

FileStream.Lock es en realidad una gama de bloqueo que impide la modificación de una porción particular de un archivo mientras el bloqueo está retenida.

+1

+1 Primera respuesta correcta. – JDB

+0

FTR @JohnKoerner lo resolvió 3 minutos antes. –

0

Si desea bloquear todo (te leído, No escribir, NO borrar, no se mueven, ...)
Abra un StreamWriter

StreamWriter sw = new StreamWriter(path); 
Cuestiones relacionadas