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?

¿Fue útil?

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.

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