2010-02-11 22 views
20

Estoy usando el TextWriter para tratar de escribir en un archivo oculto, y arroja una excepción. Parece que no puedo entender cómo escribir en un archivo oculto.¿Cómo escribo 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?

+2

Lo excepción? – tadman

+0

¿Cuál es la excepción que está lanzando? –

+1

¿Qué excepción está lanzando? – Seth

Respuesta

17

EDIT 2: Esta respuesta resuelve el problema, pero no es la forma correcta de resolver el problema. Deberías 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- realizar cambios en el archivo

// Do foo... 

3 - Establecer 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

+0

@Lucero He solucionado mi respuesta –

+3

desarmando el atributo oculto y luego restablecer oculto después de ' Cuando escribo en el archivo abundan tantos problemas. Solo use una de las sobrecargas FileStream que maneja esto correctamente, como se menciona en @Lucero answer. – enorl76

+0

vea la respuesta de @Lucero, no es necesario cambiar los atributos para escribir en un archivo oculto. – SergeyT

0

Si esa es una opción para usted, puede intentar usar File.SetAttributes para eliminar temporalmente el atributo oculto, hacer su trabajo y luego establecerlo nuevamente en el estado anterior.

+0

mala opción, como mencioné en otra respuesta – enorl76

0

Puede mostrar el archivo antes de escribir en él y después otra vez completa la escritura ocultarlo.

0

Una vez que haya abierto un archivo, puede cambiar sus atributos (incluido el de solo lectura) y continuar escribiendo en él. Esta es una forma de evitar que otros procesos sobrescriban un archivo.

Parece que sería posible mostrar el archivo, abrirlo y restablecerlo a oculto, 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.

+0

Mala opción. Si ocurre algo entre la desactivación del atributo oculto y el restablecimiento del atributo oculto, habrá cambiado el estado del archivo innecesariamente. Simple uso una sobrecarga de FileStream ctor. – enorl76

30

Parece que el problema es que el tipo de comprobación File.Exists() se realiza internamente, lo cual falla si el archivo está oculto (por ejemplo, intenta hacer un FileMode.Create en un archivo que ya existe). Por lo tanto, use FileMode.OpenOrCreate para asegurarse de que el archivo se abra o cree incluso si está oculto, o simplemente FileMode.Open si no desea crearlo si no existe.

Cuando se usa FileMode.OpenOrCreate, el archivo no se truncará, por lo que debe establecer su longitud al final para asegurarse de que no quede nada 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 usa .NET 4.5 o posterior, hay una nueva sobrecarga que impide la eliminación del StreamWriter para disponer también del flujo 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, false)) { 
    // 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); 
} 
+4

Voto arriba porque esta es la operación correcta ... no "mostrar el archivo, escribir en él, luego ocultarlo de nuevo" proceso – enorl76

+1

Gracias por aclarar exactamente POR QUÉ esto sucede, ya que no vi cómo afectó un atributo "oculto" permisos de archivos –

+0

@DaveVandenEynde, de nada. Desafortunadamente, la mayoría de las personas que visitan esta pregunta no parecen darse cuenta de que cambiar los atributos hacia adelante y hacia atrás no es realmente una solución, sino solo una solución frágil. – Lucero

9

Editar: Pierre-Luc Champigny respuesta era 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. el fin de eliminar el uso no oculta atributo:

FileInfo .Attributes &= ~FileAttributes.Hidden; 

comprueba este código si existe el archivo que lo convierten en no-oculto. antes de escribir una vez que termine, configúrelo como oculto de nuevo. Asimismo, establecer el atributo normal en el caso de que el no existía - usted no tiene que usarlo

// 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; 
+1

Bueno, arreglé el problema en mi respuesta, lo siento por eso –

+0

¿Por qué mostrar el archivo en primer lugar? Tu modificando el estado del archivo. – enorl76

+0

Dado que normalmente obtendrá una excepción de acceso no autorizado, consulte la pregunta inicial. – briler

Cuestiones relacionadas