¿Cómo se escribe en un archivo oculto?
Pregunta
Estoy utilizando el TextWriter a tratar de escribir en un archivo oculto, y es una excepción. Me parece que no puede encontrar la manera de escribir en un archivo oculto.
using (TextWriter tw = new StreamWriter(filename))
{
tw.WriteLine("foo");
tw.Close();
}
Excepción:
Unhandled Exception: System.UnauthorizedAccessException:
Access to the path 'E:\*\media\Photos\2006-08\.picasa.ini' is denied.
¿Cómo puedo escribir en un archivo oculto?
Solución
EDIT 2: Esta respuesta resuelve el problema, pero no es la forma correcta de tratar con el problema. Debe buscar la respuesta de Lucero.
tomó esta respuesta de: http: / /www.dotnetspark.com/Forum/314-accessing-hidden-files-and-write-it.aspx
1- Establecer archivo tan visible por lo que se puede sobrescribir
// Get file info
FileInfo myFile= new FileInfo(Environment.CurrentDirectory + @"\hiddenFile.txt");
// Remove the hidden attribute of the file
myFile.Attributes &= ~FileAttributes.Hidden;
2- Hacer cambios en el archivo
// Do foo...
3- Un retroceso archivo como oculto
// Put it back as hidden
myFile.Attributes |= FileAttributes.Hidden;
EDIT: Se han solucionado algunos problemas en mi respuesta como lo mencionan en briler
Otros consejos
Parece que el problema es que una especie de cheque File.Exists()
se hace internamente, lo que produce un error si el archivo está oculto (por ejemplo, trata de hacer una FileMode.Create
en un archivo que ya existe).
Por lo tanto, utilizar FileMode.OpenOrCreate
para asegurarse de que el archivo se abre o se crea incluso si está oculto, o simplemente FileMode.Open
si no desea crearlo si no existe.
Cuando se utiliza FileMode.OpenOrCreate
sin embargo, no se truncará el archivo, por lo que debe establecer su longitud al final para asegurarse de que no hay sobrante después del final del texto.
using (FileStream fs = new FileStream(filename, FileMode.Open)) {
using (TextWriter tw = new StreamWriter(fs)) {
// Write your data here...
tw.WriteLine("foo");
// Flush the writer in order to get a correct stream position for truncating
tw.Flush();
// Set the stream length to the current position in order to truncate leftover text
fs.SetLength(fs.Position);
}
}
Si utiliza .NET 4.5 o posterior, hay una nueva sobrecarga que impide la eliminación de la StreamWriter
disponer también la corriente subyacente. El código podría entonces ser escrita ligeramente más intuitiva de esta manera:
using (FileStream fs = new FileStream(filename, FileMode.Open)) {
using (TextWriter tw = new StreamWriter(fs, Encoding.UTF8, 1024, true)) {
// Write your data here...
tw.WriteLine("foo");
}
// Set the stream length to the current position in order to truncate leftover text
fs.SetLength(fs.Position);
}
Editar: Pierre-Luc Champigny respuesta fue inccorect, pero ahora fija de acuerdo a la mía, Lo estoy dejando atrás como referencia
myFile.Attributes |= FileAttributes.Normal;
no elimina el atributo Oculto del archivo. a fin de eliminar el uso atributo unhidden:
FileInfo .Attributes &= ~FileAttributes.Hidden;
Este código comprueba si existe el archivo que lo convierten en no-oculto. antes de escribir una vez que termine la puso como oculta de nuevo. Asimismo, establecer el atributo normal en el caso de que el no existiera - usted no tiene que utilizar
// if do not exists it creates it.
FileInfo FileInfo = new FileInfo(FileName);
if (true == FileInfo .Exists)
{
// remove the hidden attribute from the file
FileInfo .Attributes &= ~FileAttributes.Hidden;
} //if it doesn't exist StreamWriter will create it
using (StreamWriter fileWriter = new StreamWriter(FileName))
{
fileWriter.WriteLine("Write something");
}
// set the file as hidden
FileInfo.Attributes |= FileAttributes.Hidden;
Si eso es una opción para usted podría intentar usar File.SetAttributes
para quitar el atributo oculto temporalmente, hacer su trabajo y luego ponerlo de nuevo al estado anterior.
Puede mostrar el archivo antes de escribir en él y después completa ocultar la escritura de nuevo.
Una vez que haya abierto un archivo, puede cambiar sus atributos (incluyendo a sólo lectura) y continuar de escribir en él. Esta es una manera de evitar que un archivo sea sobrescrito por otros procesos.
Por lo tanto, parecería ser posible mostrar el archivo, abrirlo, luego restablecerlo a oculta, incluso mientras lo tienes abierto.
Por ejemplo, el siguiente código funciona:
public void WriteToHiddenFile(string fname)
{
TextWriter outf;
FileInfo info;
info = new FileInfo(fname);
info.Attributes = FileAttributes.Normal; // Set file to unhidden
outf = new StreamWriter(fname); // Open file for writing
info.Attributes = FileAttributes.Hidden; // Set back to hidden
outf.WriteLine("test output."); // Write to file
outf.Close(); // Close file
}
Tenga en cuenta que el archivo permanece oculto mientras que el proceso escriba en él.